int fun(int n)
{
if (n < 3)
{
return 1;
}
else
return fun(n - 1) + fun(n - 2);
}
int main()
{
int i, n;
printf("请输入你要打印的斐波那契数列项数:\n");
scanf_s("%d", &n);//n为打印的项数
printf("斐波那契数列:");
for (i = 1; i <= n; i++)
{
printf("%d ", fun(i));//fun函数返回的是第i项,所以用for循环打印每一项
}
return 0;
}
//斐波那契数列指的是这样一个数列:1,1,2,3,5,8, 13, 21, 34, 55, 89, 144, ...
//规律为从第三项开始,该数为前两个数的和
所以当n小于3时,需返回1(搞定前两项)
当从第三项开始时,需要将前两个数加起来。
设第n项,则该项的值为n-1项的值加上n-2项的值
而n-1项的值为n-2和n-3两项值的和
以此类推
2=1+1 fun(3)=fun(1)+fun(2)
3=2+1 fun(4)=fun(3)+fun(2)
......
(对于递归算法的时间复杂度计算=递归次数*每次递归调用的次数)
斐波那契数列(递归)的时间复杂度:O(2^n)
每次递归调用的次数为常数,与n问题规模无关
再看递归次数
其中x为右边缺的次数(右边的递归分支会提前结束)
类似于细胞分裂
从时间复杂度可以看出斐波那契数列的递归算法在实际中是没啥用的,因为实在太慢了
不如写循环
而空间复杂度为O(n),从上述图看明明是每递归一次占用一个空间,会认为是O(2^n),但实际由于栈溢出,所以只有O(n)