斐波那契数列(Fibonacci sequence),又称
黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。
斐波那契数列指的是这样一个数列:
0、1、1、2、3、5、8、13、21、34……
有一组数列,它的第一项为1,第二项为1,从第三项开始,每一项为前两项之和。
斐波那契数列的第n项Fn可以通过如下的递归公式定义:
F(1)=1,F(2)=1,
F(n)=F(n-1)+F(n-2)(n ≥ 3,n ∈ N*)
通项公式


如上,又称为“比内公式”,是用
无理数表示有理数的一个范例。
注:此时a1=1,a2=1,a(n)=a(n-1)+a(n-2),(n ≥ 3,n ∈ N*)
求第n项斐波那契数
现在写一个函数int fib(int n) 返回第n项Fn。例如,若n=0,则函数fib(0)应该返回0,若n=1, 则函数fib(1)应返回1,若 n > 1,返回 F(n-1)+F(n-2)。
若n = 9
输出:34
下面是返回斐波那契数列第n项Fn的不同方法:
方法1 (使用递归)
一个简捷的方法是直接使用递归定义关系式写出递归实现的代码,C/C++代码如下:
//Fibonacci Series using Recursion
#include<
stdio.h>
int fib(int n) {
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
int main() {
int n = 9;
printf("%d", fib(n));
return 0;
}
输出:34
时间复杂度:T(n) = T(n-1) + T(n-2),该时间复杂度是指数级别的
空间复杂度:如果考虑递归调用时栈的大小,则为O(n) ;如果不考虑调用栈的话,则为O(1)
通过观察,我们可以发现递归求解时做了很多重复的工作(见下面的递归调用树)。因此采用递归方式求解斐波那契数列的第n项Fn不是一种好的方法。