【问题标题】:Confusing Fibonacci number program令人困惑的斐波那契数字程序
【发布时间】:2014-06-03 15:16:00
【问题描述】:

好的,所以我很难理解这个程序是如何工作的:

#include <iostream>
using namespace std;

int getFibNumber(int fibIndex)
{
    if(fibIndex < 2)
        return fibIndex;
    else
        return getFibNumber(fibIndex - 1) + getFibNumber(fibIndex - 2);
}

int main(int argc, char** argv)
{
    cout << "Enter 0-based index of desired Fibonacci number: ";
    int index = 0;
    cin >> index;

    cout << "Fibonacci number is: " << getFibNumber(index) << endl;

    return 0;
}

具体来说,“getFibNumber(...)”在重复时会做什么(如果这是正确的词)?如果传入的整数“fibIndex”大于或等于2,我无法弄清楚它会做什么。很抱歉提出这样一个基本问题,但我真的被这个难住了,我觉得我错过了东西。

【问题讨论】:

  • 这称为递归。只需查看相关问题或谷歌即可。
  • 对,我以前见过并使用过递归,但是这个......我不明白“return getFibNumber(fibIndex - 1) + getFibNumber(fibIndex - 2);”是什么确实如此,因为您似乎可以只执行“return (fibIndex - 1) + (fibIndex - 2);”
  • @JTadeo28 这与再次调用该函数不同,两次。这个想法是它最终只返回 fibIndex,将其与其他函数调用的结果相加并最终返回。
  • @JTadeo28 - 最好的学习方法是用你认为正确的方式实际运行程序,看看你得到了什么(或者更好的是——调试它,看看你在每一步中得到了什么)。这将花费更少的时间,并且比阅读解释更有用。此外,互联网和SO充满了这个问题的例子和解释。
  • 另一种好方法是拿一张纸,画出getFibNumber(5) 左右发生的情况的图表。与在调试器中单步调试相比,创建该图可以帮助您更好地“查看”它。

标签: c++ recursion fibonacci


【解决方案1】:

这称为递归。它不是使用循环执行此操作,而是再次调用该函数,但使用不同的参数。最终,基本条件为真,函数将返回,导致其余调用也返回。在适当的情况下,这可能是一个非常强大的工具。

【讨论】:

    【解决方案2】:

    这里大家都提到了,这基本上就是递归。

    为了了解这个程序的工作原理,我将递归树的初始 fibIndex 设置为 5

               5                   5 calls 4 and 3.
           /      \                
          4        3               4 calls 3 and 2. 3 calls 2 and 1.
        /   \     /  \
       3     2    2   1            1 is base case, returns 1.
      / \   / \  / \  
     2   1 1  0 1  0               2 is not base case. So calls 1 and 0.
    / \
    1  0
    

    【讨论】:

    • 漂亮的图表。值得注意的是 1) 0, 1, 2 不是 实际斐波那契数列的一部分,并且 2) 这具有指数复杂度,而找到给定斐波那契数的最小复杂度仅与它。
    • 至于#1,我做了OP想要的。对于#2,我认为 OP 无法理解动态编程。
    • 谢谢你们,我现在明白了:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2019-07-11
    • 2020-01-18
    • 2015-06-05
    • 2014-05-23
    • 2014-05-03
    相关资源
    最近更新 更多