递归求k阶斐波那契序列的算法?
请教一下,
下面这个程序用递归法实现的求k阶斐波那契序列的第m项的值f,
这个算法用函数递归错在哪里呢?怎么改?
为什么这样写不行啊?
#include<iostream.h>
long fib(long n,long k)
{
if(n<=k)
{
if((n<k-1)||(n>=0))
return 0;
else
if((n==k-1)||(n==k))
return 1;
}
else
return 2*fib(n-1,k)-fib(n-k-1,k);
}
long main()
{
long n,k;
cin>>n>>k;
cout<<"fib("<<n<<","<<k<<")="<<fib(n,k)<<endl;
return 0;
}
分析: k阶斐波那契序列的第m项的值f[m]=f[m-1]+f[m-2]+......+f[m-k]
=f[m-1]+f[m-2]+......+f[m-k]+f[m-k-1]-f[m-k-1]
=2*f[m-1]-f[m-k-1]
所以上述算法的时间复杂度仅为O(m). 如果采用递归设计,将达到O(k^m). 即使采用暂存中间结果的方法,也将达到O(m^2).
下面这个程序用递归法实现的求k阶斐波那契序列的第m项的值f,
这个算法用函数递归错在哪里呢?怎么改?
为什么这样写不行啊?
#include<iostream.h>
long fib(long n,long k)
{
if(n<=k)
{
if((n<k-1)||(n>=0))
return 0;
else
if((n==k-1)||(n==k))
return 1;
}
else
return 2*fib(n-1,k)-fib(n-k-1,k);
}
long main()
{
long n,k;
cin>>n>>k;
cout<<"fib("<<n<<","<<k<<")="<<fib(n,k)<<endl;
return 0;
}
分析: k阶斐波那契序列的第m项的值f[m]=f[m-1]+f[m-2]+......+f[m-k]
=f[m-1]+f[m-2]+......+f[m-k]+f[m-k-1]-f[m-k-1]
=2*f[m-1]-f[m-k-1]
所以上述算法的时间复杂度仅为O(m). 如果采用递归设计,将达到O(k^m). 即使采用暂存中间结果的方法,也将达到O(m^2).
...全文
相关推荐
计算机程序的构造与解释答案
计算机程序的构造与解释,这本书不用介绍了吧,经典啊。这份答案是花了5分从百度文库上下的,挺全吧应该,
c 语言100个经典算法
C语言已经深深的进入各种操作系统,通过对C语言的学习,能够很快的掌握操作系统的底层结构和操作方式,因此C语言是学习编程的首选语言。
java习题 适合于Java初学者
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21...
CJ2-08-动态规划-基础动归综合.pdf
CJ2-08-动态规划-基础动归综合.pdf
java必做练习50题
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问一年中每个月的兔子总数为多少对? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。


