递归求k阶斐波那契序列的算法?

zhongruanjian zhongruanjian 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请教一下,
下面这个程序用递归法实现的求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分从百度文库上下的,挺全吧应该,

just4rmb

c 语言100个经典算法

C语言已经深深的进入各种操作系统,通过对C语言的学习,能够很快的掌握操作系统的底层结构和操作方式,因此C语言是学习编程的首选语言。

aklock

java习题 适合于Java初学者

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21...

zzzdddlll2006

CJ2-08-动态规划-基础动归综合.pdf

CJ2-08-动态规划-基础动归综合.pdf

cdming

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个数,每个数分解出个位,十位,百位。

zschuxin
评论 17
收藏 已收藏
分享
返回顶部