将递归函数转换为迭代版本

时间:2017-02-15 03:03:22

标签: java recursion iteration

我需要将以下递归代码转换为迭代版本,并且我的想法很糟糕。我觉得我错过了一些明显的东西。任何帮助表示赞赏。

getName()

3 个答案:

答案 0 :(得分:2)

这类似于迭代的斐波那契数列,其中您将函数f()的初始两个值保存在两个变量ab中。然后计算前两个结果中当前N的结果:

public static int f(int n) {
    if ( n <= 1 ) { 
        return n; 
    }

    int result = 0; 
    int a = 0, // f(0) = 0
        b = 1; // f(1) = 1

    // start iteration at n=2 because we already have f(0) and f(1)
    for(int i = 2; i <= n; i++) {
        // f(n) = 2 * f(n-2) + f(n-1)
        result = 2 * a + b;

        // f(n-2) = f(n-1)
        a = b;
        // f(n-1) = f(n)
        b = result;
    }

    return result;
}

答案 1 :(得分:2)

在我看来,如果你可以运用你的数学技能并计算出公式,那么递归和迭代解决方案都很薄弱。

在这种情况下,我们有:f(n)=(2 ** n - ( - 1)** n)/ 3。贝娄是你如何解决的。

f(0) = 0
f(1) = 1
f(n) = f(n-1) + 2 * f(n-2)

So the polynomial for this recurrence is:
r ** 2 = r + 2

If you sole that you will get the values of r as r1 =−1 and r2 =2

So the solution to the recurrence is on the form:
f(n) = c1 ∗ r1 ** n + c2 ∗ r2 ** n

To work out the values for c1 and c2 constants  just use the initial condition f(0) = 0 and f(1) = 1 and you will get
c1 = -1/3 and c2 = 1/3

So the final formula for your iteration is
f(n) = (-1 * (-1) ** n + 2 ** n)/3 = (2 ** n -(-1) ** n)/3.

一旦你知道用java或任何其他语言实现它的公式很容易。

public static int f(int n) {
    return n <= 1 ? n: (Math.pow(2,n) - Math.pow(-1, n)) / 3;
}

希望有所帮助

答案 2 :(得分:1)

您可以尝试以下代码。它类似于斐波那契系列。

public static int computeRecursive(int n){
int a[]=new int[n];
a[0]=1; a[1]=1;
for(int i=2;i<n;i++){
    a[i]=2*a[i-2]+a[i-1];
}
return a[n-1];
}