Математическая формула - PullRequest
1 голос
/ 10 мая 2019

Мне нужно построить последовательность, подобную

(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.

Я не могу придумать, как выполнить итерацию, чтобы формула строила

Ответы [ 4 ]

0 голосов
/ 07 июня 2019

Ценю всю вашу помощь, и я пошел с 1000-1000 / 36 * ((initial_date -final_date) +1. Это дает мне правильные результаты.

0 голосов
/ 10 мая 2019

Возможно, вы захотите использовать рекурсию, но не уверены, что это именно то, что вам нужно. Вероятно, вы можете получить представление о решении ниже и сделать это самостоятельно.

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;
}
0 голосов
/ 10 мая 2019

Приведенная ниже рекурсивная формула должна помочь (даже если вы, вероятно, должны пересмотреть операции, поскольку я не получаю их из поставленных вами скобок):

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) должен составить формулу, которую вы ищете.

0 голосов
/ 10 мая 2019

Если я правильно понимаю формулу, это должно сработать 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);
    }
...