Итерация для отрицательных целых чисел
Я написал итеративную функцию для генерации результата для выражения:
F(n) = 3*F(n-1)+ F(n-2) + n
public int calculate(int n){
if(n == 0) {
return 4;
}
if(n ==1){
return 2;
}
else {
int f=0;
int fOne = 4;
int fTwo = 2;
for (int i=2;i<=n;i++) {
f = 3*fOne + fTwo + i;
fTwo = fOne;
fOne = f;
}
return f;
}
}
Могу ли я изменить функцию, чтобы получить результат и для отрицательных целых чисел?
2 ответа
Это простая математическая задача:
F(n) = 3*F(n-1)+F(n-2)+n
таким образом
F(n-2) = F(n)-3*F(n-1)-n
Замена n = k+2
и получить:
F(k) = F(k+2)-3*F(k+1)-k-2
Таким образом, вы можете рассчитать свою функцию, имея два следующих числа. Вот обновленный код:
public int calculate(int n) {
if (n == 0) {
return 4;
}
if (n == 1) {
return 2;
} else if (n < 0) {
int f = 0;
int fOne = 4;
int fTwo = 2;
for (int i = -1; i >= n; i--) {
f = fTwo - 3 * fOne - i - 2;
fTwo = fOne;
fOne = f;
}
return f;
} else {
int f = 0;
int fOne = 4;
int fTwo = 2;
for (int i = 2; i <= n; i++) {
f = 3 * fOne + fTwo + i;
fTwo = fOne;
fOne = f;
}
return f;
}
}
Результаты от -10 до 9:
-10: 520776
-9: -157675
-8: 47743
-7: -14453
-6: 4378
-5: -1324
-4: 402
-3: -121
-2: 37
-1: -11
0: 4
1: 2
2: 16
3: 55
4: 185
5: 615
6: 2036
7: 6730
8: 22234
9: 73441
Вы можете легко проверить, что ваше исходное условие выполнено и для отрицательных чисел. Например
F(0) = 3*F(-1)+F(-2)+0 = 3*(-11)+37+0 = 4
Если ваш метод не предназначен для работы с отрицательными значениями, вы можете обвинить вызывающую сторону в передаче отрицательного значения. Просто брось InvalidParameterException
когда n отрицательно.
public int calculate(int n){
if (n < 0){
throw new InvalidParameterException("Negative parameter");
}
//... proceed as usual
}