码迷,mamicode.com
首页 > 其他好文 > 详细

Fibonacci数列-递归实现

时间:2020-03-16 23:14:50      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:存在   return   斐波那契数   需要   优化   int   就会   计算   ||   

Fibonacci数列递归的实现

  • 先来一个fibonacci数列的定义:
    Fibonacci数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N* 。
    Fibonacci数列在程序中的实现还是很容易,他是一个典型的可以用递归现实的算法。
  • 我们先来一个普通的递归写法:
int fibo(int n)
{
        if(n == 1 || n == 2)
                return 1;
        return fibo(n-1)+fibo(n-2);

}
int main()
{
        int n,result;
        printf("请输入:");
        scanf("%d",&n);
        result = fibo(n);
        printf("%d\n",result);
}

递归代码简洁,但是如果不做一定的优化,很容易出现栈溢出。以上的实现就会非常耗费内存,因为当n>2时,fibo函数需要调用自身n-2次才开始有返回值,然后开逐个返回原函数并开始计算。如果要求的n值非常大的话,可能需要同时保存成千上百个调用记录,很容易发生"栈溢出"错误(stack overflow)。

  • 但是我们可以对以上实现做一个小优化-尾递归
    尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
    一般来说,由于只存在一个调用记录,所以永远不会发生"栈溢出"错误。
    优化后的递归函数:
int fibo(int n,int i,int j)
{
        if(n ==1 || n ==2)
                return j;
        return fibo(n-1,j,j+i);
}

int main()
{
        int n,result;
        printf("请输入:");
        scanf("%d",&n);
        result = fibo(n,1,1);
        printf("%d\n",result);
}

这样一来,当fibo函数调用自身,就开始有return值,在递归结束后不用再把return值逐个返回原函数。尾递归的实现方式,编译器可以帮我们节省大量的内存消耗,妈妈再也不用我的栈溢出了!

Fibonacci数列-递归实现

标签:存在   return   斐波那契数   需要   优化   int   就会   计算   ||   

原文地址:https://www.cnblogs.com/tansss/p/12507644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!