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

My recursion solution does not work but DP solution works and I don't know why

我正在努力使用递归找到第 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) returns 5。但是,fib(6) returns 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) returns 5 和 fib(6) 输出 27。 我似乎无法弄清楚为什么会这样。

递归解决方案与您提供的递归描述不符。您的调用传递了两个参数:

t2^2
t1 + t2^2

第一个不应该平方。

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

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

1
2
5
27
734
538783
290287121823
84266613096281243382112

抱歉.. 我刚刚在我的递归调用中看到了一个错误。应该是

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

而不是

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