【问题标题】:Problems with Recursive Multiplicative Fibonacci Sequence递归乘法斐波那契数列的问题
【发布时间】:2013-11-18 18:53:07
【问题描述】:

我正在编写一个递归方法来计算乘法斐波那契数列。此序列类似于常规斐波那契数列,不同之处在于不是将前两个数字相加来查找下一个数字,而是将它们相乘。我目前编写了这个方法,但不是返回我认为正确的结果,而是无论输入数字是什么,该方法都返回 0。任何帮助或想法将不胜感激。 方法如下:

public static int fibonacciPower(int n)
{
    if(n < 2)
    {
        return n;
    }
    else
    {
        return (fibonacciPower(n-1) * fibonacciPower(n-2));
    }

}

【问题讨论】:

  • 请注意,斐波那契是一种算法,一般来说,递归是一种非常糟糕的实现。
  • 你在哪里调用方法?有什么价值?
  • @Servy 尾递归对我来说似乎很好......
  • @Theolodis Fib(5) 计算 Fib(4) 和 Fib(3)。 Fib(4) 再次计算 Fib(3) 和 Fib(2)。 Fib(3)(运行两次)计算 Fib(2)(为 Fib(4) 计算并在 Fib(3) 中计算两次)。我希望你能明白。它实际上将 O(n) 操作转换为 O(2^n) 操作。也就是说,除非您缓存所有先前计算的值,但如果您这样做,内存占用将从 O(1)(使用迭代解决方案)变为 O(n)。
  • 这就是所谓的尾递归......

标签: java algorithm recursion fibonacci multiplication


【解决方案1】:

你需要返回1

if(n < 2)
{
    return 1;
}

这是因为,如果 n 变为 0,你最终会乘以 0,然后你的乘积变为 0。因此,如果 n 等于 0 或 1,我们将乘以 1

【讨论】:

  • 除此之外,斐波那契的正式定义只是将 Fib(0) 定义为 1。
  • @Theolodis 嗯,它应该是 1,1,1,1,1,它不会从零开始,但这只是定义的算法的正确结果。如果 0 是 1 并且 1 是 1 并且其他所有值都是前两个值的乘积,那么您将永远不会得到除 1 之外的任何值。因此,如果您愿意,可以将该方法替换为 return 1;
  • 看起来有人在疯狂投票。
  • @AnkitRustagi 不完全是。其中一些是我的,对于那些明显误解了这个问题的人。其中一些来自其他人
  • @informatik01 我之前从未听说过这样的函数,而且鉴于它不会返回任何有用的东西,我对此一点也不感到惊讶。
猜你喜欢
  • 1970-01-01
  • 2011-07-27
  • 2014-11-28
  • 2012-11-19
  • 2016-11-07
  • 2012-02-16
  • 2010-12-03
  • 2016-02-24
相关资源
最近更新 更多