我必须构建一个序列,比如
(amount-(amount/36*1)) +
(amount-(amount/36*1 + amount-amount/36*2)) +
(amount-(amount/36*1 + (amount-amount/36*2) + (amount-amount/36*3))) +
(amount-(amount/36*1 + (amount-amount/36*2) + (amount-amount/36*3) + (amount-amount/36*4))) +
...
(amount-(amount/36*1 + (amount-amount/36*2) + (amount-amount/36*3) + (amount-amount/36*4) + ... + (amount-amount/36*n)))其中n是一个值,我将根据事件发生后经过了多少个日历月来单独计算。公式应该按照上面的方式进行,直到满足n的值。
我想不出如何迭代才能构建公式
发布于 2019-05-10 06:02:01
如果我正确理解了这个公式,这应该是有效的calc(amount, 0, 1, n)
public double calc(double amount, double sum, int curr, int n) {
if (curr > n) return 0;
sum += (amount - amount / 36 * curr);
return sum + calc(amount, sum, curr + 1, n);
}发布于 2019-05-10 06:02:11
你可能想要使用递归,不确定这是否是你想要的正确的东西。也许你可以从下面的解决方案中得到一个想法,然后自己去做。
public double calculate(double amount, int N){
double total = 0;
if(N==0){
return total;
}
for(int i=1;i<=N;i++){
total + = (amount - amount/(36*i));
}
return calculate(amount, N-1) + total;
}发布于 2019-05-10 06:18:45
下面的recursive公式应该可以做到这一点(即使你可能应该复习一下这些操作,因为我并不是真的从你放的括号中得到它们):
private static double sumUpToN(double amount, int n) {
double result = amount;
for (int j = 1; j <= n; j++) {
result += (amount - amount/36*j);
}
return n > 0 ? result + sumUpToN(amount, n-1) : result;
}您可以这样命名您的公式:
double test = sumUpToN(100, 3);将会发生以下情况:
从n == 3开始
它计算result = 100 + (100-100/36*1) + (100-100/36*2) + (100-100/36*3) = 383.33333333333337,然后获取这个值,并将其相加到:
转到n == 2
它计算result = 100 + (100-100/36*1) + (100-100/36*2) = 291.6666666666667,然后获取这个值,并将其相加到:
转到n == 1
它计算result = 100 + (100-100/36*1) = 197.22222222222223,然后获取这个值,并将其相加到:
转到n == 0
它只返回100。如果您不希望最后这一步发生,请将return条件从n > 0更改为n > 1。
返回结果
所有这些(972.2222222222223)的总和应该是您要搜索的公式。
https://stackoverflow.com/questions/56067934
复制相似问题