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

问题描述:

我正在寻找使用递归找到第n个斐波纳契数的修改版本。 A1 = 0,A2 = 1,A3 = A1 + A2^2,A4 = A2 + A3^2 ...等等我的递归解决方案不起作用,但DP解决方案工作,我不知道为什么

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. 我似乎无法找出为什么是这种情况。

+0

请提供了一系列的成果,所以我们可以看到两个发散。 – Prune

+0

递归方法是错误的,因为你没有返回任何东西 –

+1

它不需要返回任何东西;如在DP解决方案中,唯一的结果是打印输出。 – Prune

递归解决方案与您给出的重复描述不匹配。您的电话传递两个参数:

t2^2 
t1 + t2^2 

第一个不应该被平方。

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

上述工作完成后,我通过10得到值3的结果如下:

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); 
+0

......这正是我之前几分钟发布的内容。 :-) – Prune