斐波那契数列,也被称为黄金分割数列,是由意大利数学家列昂纳多·斐波那契提出的。这个数列从第三项开始,每一项都等于前两项之和,具体为:0、1、1、2、3、5、8、13、21、34……
斐波那契数列的递推公式为:
知道公式后,写递推代码就很简单啦
#include <stdio.h>
int fibonacci(int n){
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main(){
int n;
scanf("%d",&n);
printf("%d",fibonacci(n));
return 0;
}
这个斐波那契数列的递归求解算法的时间复杂度是指数级的。具体来说,它的时间复杂度是 O(2^n)。这是因为对于每一个 n
,算法都会递归地计算 fibonacci(n-1)
和 fibonacci(n-2)
,而这两个递归调用又会分别产生它们自己的递归调用,以此类推。
这种递归方式导致了大量的重复计算。例如,为了计算 fibonacci(5)
,我们需要计算 fibonacci(4)
和 fibonacci(3)
。在计算 fibonacci(4)
时,我们又需要计算 fibonacci(3)
和 fibonacci(2)
。这里 fibonacci(3)
就被重复计算了。随着 n
的增大,这种重复计算的数量会急剧增加,导致算法的效率非常低。
递归树的深度(也就是计算斐波那契数的递归调用次数)是 n
,但在每一层递归中,我们都在做两个递归调用,这导致总的计算量按指数级增长。
对于大的 n
值,这种递归方法是非常低效的。在实际应用中,通常会使用动态规划(非递归)或矩阵快速幂等方法来避免重复计算,从而提高算法的效率。这个在本专栏的其他文章中有写到,欢迎阅读:http://t.csdnimg.cn/j9gJh
上述是求对应位置的斐波那契数,如果想要直接获得前XX位斐波那契数列,可以对代码进行如下修改:
#include <stdio.h>
int fibonacci(int n){
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<=n;i++){
printf("%d ",fibonacci(i));
}
return 0;
}
输入10,则输出结果为