【问题标题】:Fibonacci series斐波那契数列
【发布时间】:2015-06-05 01:40:57
【问题描述】:

我正在尝试使用斐波那契数列进行练习。 我必须使用递归函数来实现斐波那契的素数 n 并打印它们 在同一个函数中。问题是我的函数也打印中间数字。 例如,n = 6 的结果应该是:1 1 2 3 5 8。 有什么解决办法吗?

谢谢

#include<iostream>
using namespace std;
int rec(int n)
{
    int a, b;
    if (n == 0 || n == 1)
    {
        return n;
    }
    else
    {
        a = rec(n - 1);
        b = rec(n - 2);
        cout << a + b << endl;
        return a + b;
    }

}
int main()
{ 
    int n = 6;
    rec(n);
    return 0;
}

【问题讨论】:

  • 我喜欢斐波那契。你如何应用它不是学术/家庭作业?
  • 您需要标记您的语言,并且您需要显示 6 的当前输出。
  • 对不起。我的 6 输出是:1 2 1 3 1 2 5 1 2 1 3 8。我看到了 stackoverflow.com/questions/1518726/recursive-Fibonacci 但我的问题是使用递归函数打印数字,而不是斐波那契函数本身。

标签: c++ recursion fibonacci


【解决方案1】:

我得到了static int 的帮助。这如你所愿。

void rec(int n)
{
    static int a=0,b=1,sum;
    if(n>0)
    {
         sum = a+b;
         a=b;
         b= sum;
         cout<<sum<<" ";
         rec(n-1);
    }
}

虽然您必须自己在main() 中打印第一个斐波那契数。

cout<<"0 ";
rec(n);

【讨论】:

  • 这个例子只是使用递归来替换循环,实际上它是 for( ; n > 0 ; n -= 1){ ... },使用静态变量来计算斐波那契数。此外,第一个斐波那契数通常是 0 (0 1 1 2 3 5 ...)。
  • @rcgldr.:是的,你是对的,递归仅用于避免 for 循环。斐波那契数通常是 0 1 1 2 等。但我会修改我的答案(一个错误)。
  • 非常优雅的解决方案!
【解决方案2】:

因为您在rec 中打印,所以由于递归,它会打印多次。无需在递归函数中打印。而是在 main 中打印结果

#include<iostream>
using namespace std;
int rec(int n)
{
    int a, b;
    if (n == 0 || n == 1)
    {
        return n;
    }
    else
    {
        a = rec(n - 1);
        b = rec(n - 2);
        //cout << a + b << endl;
        return a + b;
    }
}

int main()
{
    int n = 6;

    for (int i = 1; i <= n; i++)
    {
        cout << rec(i) << endl;
    }

    system("pause");
    return 0;
}

【讨论】:

    【解决方案3】:

    你可以用这个:

    #include<iostream>
    using namespace std;
    #define MAXN 100
    int visited[MAXN];
    int rec(int n)
    {
        if(visited[n])
        {
            return visited[n];
        }
        int a, b;
        if (n == 0|| n==1)
        {
            return n;
        }
        else
        {
            a = rec(n - 1);
            b = rec(n - 2);
            cout << " " <<a + b;
            return visited[n] = a + b;
        }
    
    }
    int main()
    {
        int n = 6;
        cout<< "1";
        rec(n);
        cout<<endl;
        return 0;
    }
    

    此实现使用动态编程。所以它减少了计算时间:)

    【讨论】:

    • 你可能想在rec()的开头添加if(n &gt;= MAXN){ return -1; }
    • 实际上 n 不会等于 MAXN。最大 n 可以是 46。如果 n>46,那么它将溢出整数范围
    【解决方案4】:

    我很确定您已经找到了可行的解决方案,但我有一个稍微不同的方法,不需要您使用数据结构:

    /* 作者:埃里克·吉坦古 日期:2015 年 7 月 29 日 这个程序为 32 位数字的范围吐出斐波那契数列 假设:所有值都是 +ve ;因此 unsigned int 在这里工作 */

    #include <iostream>
    #include <math.h>
    #define N pow(2.0,31.0)
    
    using namespace std;
    
    void fibionacci(unsigned int &fib, unsigned int &prevfib){
        unsigned int temp = prevfib;
        prevfib = fib;
        fib += temp;
    }
    void main(){
        int count = 0;
        unsigned int fib = 0u, prev = 1u;
    
        while(fib < N){
            if( fib ==0 ){
                fib = 0;
                cout<<" "<< fib++ <<" \n ";
                continue;
            }
            if( fib == 1 && count++ < 2 ){
                fib = 1;
                cout<< fib <<" \n ";
                continue;
            }
            fibionacci(fib, prev);
            cout<< fib <<" \n ";
        }
    }
    

    【讨论】:

    • 输出:0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、 6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,922 7465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733 , 113490317 0 , 1836311903 , 2971215073
    • 我认为 OP 想要一个递归实现。
    • 感谢 Mewa 指出这一点,我确实意识到在我已经发布之后,但我想我提供了一种不同的方法,但谢谢你 :)
    【解决方案5】:

    试试这个递归函数。

    int fib(int n)
       return n<=2 ? n : fib(n-1) + fib(n-2);
    

    这是我所知道的最优雅的解决方案。

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2014-05-19
      • 2015-08-30
      • 2013-03-14
      • 2013-02-24
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多