标签:return 数列 int 斐波 Fibonacci 那契
1. 基本定义
又称为“兔子数列”,指的是这样一个数列: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*)
2. 代码实现
2.1 基本递归代码(不实用)
1 int Fibonacci(int n) { 2 if( n == 0 ) 3 return 0; 4 if ( n == 1 ) 5 return 1; 6 else 7 return Fibonacci(n - 2) + Fibonacci(n - 1); 8 }
解析:以上斐波那契数列是基本的递归方法,但不实用,因为在程序运行时,一旦 n 值过大易造成堆栈溢出状况而且重复严重,举例:n=4,看看程序怎么跑的:
Fibonacci(4) = Fibonacci(3) + Fibonacci(2); = Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0); 对于程序而言每一次的递归都是未知的,光是F(1) 便循环了3次之多,故不推荐!
2.2 进阶递归代码(矩阵快速幂)
1 int Fibonacci(int n) { 2 if( n == 0 ) 3 return 0; 4 else if ( n == 1 || n == 2) 5 return 1; 6 else if ( n == 3) 7 return 2; 8 else 9 return 3* Fibonacci(n - 3) + 2* Fibonacci(n - 4); 10 }
解析:该进阶方法通过斐波那契数列的一个简单规律可以使得冗余程度不再像第一个那般复杂重复,节省空间。矩阵快速幂详解参见:https://www.cnblogs.com/MMMMMMMW/p/12300262.html
2.3 动态规划版代码
1 int Fibonacci(int n) { 2 int f = 0, g = 1; 3 while(n -- > 0) { 4 g += f; 5 f = g - f; 6 } 7 return f; 8 }
解析:该方法中循环 n 次,因为第 n 个数字是前 n 个数字以规律相加得来,定义的 f 和 g 表示每一次第 n 个数相加时的 n - 1 和 n - 2 位 ,f 在每次运算过后都要 被 g 减去之前的数,方可得到第 n 位的数字。
图解:
标签:return,数列,int,斐波,Fibonacci,那契 来源: https://www.cnblogs.com/john1015/p/12909898.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。