繁体   English   中英

编写一个迭代算法递归,但我不明白我做错了什么

[英]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));
}

我刚开始学习递归算法,我不明白为什么这不起作用。 有什么建议么? 谢谢!

迭代: nvar是不同的值

递归:只有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM