[英]I have a somewhat (read: EXTREMELY) broken hitwall function and I don't see what I am doing wrong
[英]Writing an iterative algorithm recursive, but I don´t see what Im doing wrong
我正在尝试编写一个迭代算法递归,但我的代码不起作用。 这是我的迭代算法:
public long calculate(long n) {
int var = 0;
for (int i = 0; i < n; i++) {
var += ((var - 1) + (var - 3));
}
return var;
这就是我为递归所做的尝试:
public long calculate(long n) {
if (n <= 2) {
return 0;
}
else {
return n + calculate((n - 1) + (n - 3));
}
我刚开始学习递归算法,我不明白为什么这不起作用。 有什么建议么? 谢谢!
迭代: n
和var
是不同的值
递归:只有n
,所以公式与以前不同 - 最简单的解决方案,使用两个参数而不是一个
注意:不是递归解决问题的好例子,也不是最好的开发方式(将迭代算法转换为递归)。 递归解决方案最适合递归问题... INHO
迭代法中的计算可以改写为:
public static long calculateIterative(long n) {
int var = 0;
for (int i = 0; i < n; i++) {
var += 2 * (var - 2); //((var - 1) + (var - 3));
}
return var;
}
在这里我们可以看到,对于 n = 0,它返回 0,对于 n = 1,var = -4,对于 n = 2:-4 + 2 * (-4 - 2) = -16,等等。
因此,递归 function 必须“模仿”复合赋值并且可以转换:
var += 2 * (var - 2);
-> var = var + 2 * (var - 2);
-> var = 3 * var - 4;
所以最后它可能看起来像这样:
public static long calculate(long n) {
if (n <= 0) {
return 0;
}
return 3 * calculate(n - 1) - 4;
}
测试:
for (int n = 0; n < 10; n++) {
System.out.printf("iterative(%d)=%-6d recursive(%d)=%-6d%n",
n, calculateIterative(n), n, calculate(n)
);
}
Output:
iterative(0)=0 recursive(0)=0
iterative(1)=-4 recursive(1)=-4
iterative(2)=-16 recursive(2)=-16
iterative(3)=-52 recursive(3)=-52
iterative(4)=-160 recursive(4)=-160
iterative(5)=-484 recursive(5)=-484
iterative(6)=-1456 recursive(6)=-1456
iterative(7)=-4372 recursive(7)=-4372
iterative(8)=-13120 recursive(8)=-13120
iterative(9)=-39364 recursive(9)=-39364
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.