【问题标题】:Recursive Fibonacci .. no idea what is going on递归斐波那契..不知道发生了什么
【发布时间】:2012-03-28 13:32:26
【问题描述】:

我最近在 c++ 应用程序中编写了一个程序函数代码,用于计算斐波那契数列中的 F(n)。

无论如何,我无法让它使用递归产生正确的结果。例如,每当我输入值 5 时,它都会返回 8,如果我的其他程序代码返回正确的值 5。

这是我正在使用的功能......以及我从网上获得的代码。我遇到的问题是来自网络的代码和我的代码完全相同(几乎)但两者都给出了错误的值......

http://codepad.org/pMKs4kvb

发生了什么事?

【问题讨论】:

    标签: c++ recursion fibonacci


    【解决方案1】:

    嗯,简单来说,你的函数就是打印出以下系列:

    1, 1, 2, 3, 5, 8 ...
    

    因此,F(5) = 8(如果我们在这里谈论零索引)。如果要打印以下内容:

    0, 1, 1, 2, 3, 5, 8 ... 
    

    OEIS 识别的序列是什么,那么您需要做的就是确保定义F(0) = 0。在这种情况下,您的功能应该是:

    int FibiRec(int n) {
        if (n == 0 || n == 1) {
            return n; // IMPORTANT
        } else {
            return FibiRec(n-1) + FibiRec(n-2);
        }
    }
    

    同时我想补充一点:你的函数有一个可怕的时间复杂度O(2^n)。使用您的函数,尝试生成第 40 个或第 100 个斐波那契数,您就会明白我在说什么。

    【讨论】:

    • 或者您可以简单地将条件语句修改为: if (n == 1 || n == 2) {return 1;} else {return FibiRec(n-1) + FibiRec(n -2);}
    • @Ikahtz:如果我要查询 FibRec(0),它会一直运行到堆栈溢出。
    【解决方案2】:

    您的编号从 0 开始...而程序编号从 1 开始

    n : 0, 1, 2, 3, 4, 5

    F(n) : 1, 1, 2, 3, 5, 8

    【讨论】:

      【解决方案3】:

      我猜您需要在 if 循环中添加另一个条件 n==2...您的程序应该是...

      int FibiRec(int n){
              int result = 0;
              if (n == 0 || n == 1 || n==2){
                  return 1;
              }else{
                  return FibiRec(n-1) + FibiRec(n-2);
              }
          }
      

      这是因为,对于 n=2,FibiRec(1) 和 FibiRec(0) 将被调用,这是您的停止条件......

      【讨论】:

      • 好吧,根据你的函数,F(0) = F(1) = F(2) = 1。除此之外,因为我们知道 F(n) 是根据 F 定义的(n-1) 和 F(n-2),那么为什么我们需要 3 个明确的定义作为第 3 个,根据定义是根据前 2 个定义的?
      • 我假设,他正在向用户询问系列中的位置(n)......第二个位置将保持值“1”......
      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2014-04-02
      • 1970-01-01
      • 2017-11-18
      • 2014-01-08
      • 2011-12-14
      • 2012-11-29
      相关资源
      最近更新 更多