我的递归解决方案不起作用,但DP解决方案有效,我不知道为什么

时间:2016-09-21 17:13:45

标签: java recursion dynamic-programming fibonacci

我正在使用递归找到第n个斐波纳契数的修改版本。 a1 = 0,a2 = 1,a3 = a1 + a2 ^ 2,a4 = a2 + a3 ^ 2 ......等等

fib(0, 1, n);
public static void fib(BigInteger t1, BigInteger t2, int n) {
    if (n == 3) {
        System.out.println(t1.add(t2.multiply(t2)));
    } else {
        fib(t2.multiply(t2), t1.add(t2.multiply(t2)), n - 1);
    }
}

答案适用于较小的数字。 fib(0,1,5)返回5.但是,fib(6)返回29而不是27

但是,我的DP解决方案会输出正确的值;

public static void fib(BigInteger t1, BigInteger t2, int n) {
    BigInteger[] bi = new BigInteger[n];
    bi[0] = t1;
    bi[1] = t2;
    for (int i = 2; i < n; i++) {
        bi[i] = bi[i-2].add(bi[i-1].multiply(bi[i-1]));
    }
    System.out.println(bi[n-1]);
}

fib(0,1,5)返回5,fib(6)输出27。 我似乎无法弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:0)

递归解决方案与您提供的重复说明不匹配。你的电话传递了两个论点:

t2^2
t1 + t2^2

第一个不应该被平方。

fib(t2, t1.add(t2.multiply(t2)), n - 1);

完成后,我得到以下值3到10的结果:

1
2
5
27
734
538783
290287121823
84266613096281243382112

答案 1 :(得分:0)

道歉......我刚刚看到了递归电话的错误。应该是

fib(t2, t1.add(t2.multiply(t2)), n - 1);

而不是

fib(t2.multiply(t2), t1.add(t2.multiply(t2)), n - 1);