我需要将以下递归代码转换为迭代版本,并且我的想法很糟糕。我觉得我错过了一些明显的东西。任何帮助表示赞赏。
getName()
答案 0 :(得分:2)
这类似于迭代的斐波那契数列,其中您将函数f()
的初始两个值保存在两个变量a
和b
中。然后计算前两个结果中当前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];
}