递归、迭代求斐波那契数列

今天给大家分享一下基本算,就是使用递归、迭代求斐波那契数列,同时给解释迭代算法求解波那契数列的算法的时间复杂性和空间复杂性和分析递归算法求解波那契数列的算法的时间复杂性和空间复杂性。

对于迭代,确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式或关系。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。而且要对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。下面就是迭代算法:

#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)。



猜你喜欢

转载自blog.csdn.net/zjy18886018024/article/details/80721689
今日推荐