【问题标题】:My recursion solution does not work but DP solution works and I don't know why我的递归解决方案不起作用,但 DP 解决方案有效,我不知道为什么
【发布时间】:2017-01-30 01:36:08
【问题描述】:

我正在使用递归查找第 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。 我似乎无法弄清楚为什么会这样。

【问题讨论】:

  • 请提供一系列结果,以便我们看到两者的分歧点。
  • 递归方法错误,因为你没有返回任何东西
  • 不需要返回任何东西;与 DP 解决方案一样,唯一的结果是打印输出。
  • 这不是斐波那契数。 en.wikipedia.org/wiki/Fibonacci_number
  • 我在我的问题中提到了“修改版”。

标签: java recursion dynamic-programming fibonacci


【解决方案1】:

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

t2^2
t1 + t2^2

第一个不应该是平方的。

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

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

1
2
5
27
734
538783
290287121823
84266613096281243382112

【讨论】:

    【解决方案2】:

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

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

    而不是

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

    【讨论】:

    • ...这正是我几分钟前发布的内容。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多