今天给大家分享一下基本算,就是使用递归、迭代求斐波那契数列,同时给解释迭代算法求解波那契数列的算法的时间复杂性和空间复杂性和分析递归算法求解波那契数列的算法的时间复杂性和空间复杂性。
对于迭代,确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式或关系。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。而且要对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。下面就是迭代算法:
#include<stdio.h> #define N 80 long fun( int);//函数调用 int main()//主函数 { int n;//定义 scanf("%d",&n);//输入 printf("the value is %ld\n",fun(n)); return 1; } long fun(int n) { long i; long Fib[N]; //定一个数组 Fib[0]=0;Fib[1]=1; //迭代算法控制 for(i=2;i<=n;i++) Fib[i]=Fib[i-1] + Fib[i-2]; return Fib[n]; }
结果:
对于这个程序分析迭代算法的时间复杂度和空间复杂度,
n-1次加法运算。所以,它和n一样都是线性函数,“仅在”作为n的二进制位数的函数时,才表现为指数函数。所以我们只需要存储两个元素就足够了。因此在用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量,所以这个程序On,O1
#include<stdio.h> #include<iostream.h> int f(int n); int main(){ int n,sum; cout <<"Enter one number:"<<'\n'; cin>> n; //输入一个整数n sum=f(n); //函数调用 cout<<sum<<'\n'; return 0; } int f(int n) { if(n<=1) return n; else return f(n-1)+f(n-2);//递归调用 }
结果展示:
分析其时间复杂度和空间复杂度;
(1) ;
(2)
但是递归还是有缺点的,递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等
On,O1
文章来源: 递归、迭代求斐波那契数列