c语言斐波那契数列递归数组,C语言数据结构学习:递归之斐波那契数列

自己对递归还是不太熟练,于是做的时候就很吃力,就是翻棋子直到棋盘上所有棋子的颜色一样为止,求最少翻多少次,方法是枚举递归。然后就打算先做另一道递归的题(从数组中取出n个元素的组合),但是同样在递归的问题上不太理解。好吧,于是复习CPP,在第229页的时候,看到了斐波那契数列,回想起之前做过的一道题目,发现可以用递归的方法来做。于是决定优化一下之前的代码。

以下这段摘自《C primer plus》

斐波那契数列的定义如下:第一个和第二个数字都是1,而后续的每个数字是其前两个数字之和,例如,数列中前几个数字是1,1,2,3,5,8和13。…下面我们创建一个函数,它接受一个正整数n作为参数,返回相应的斐波那契数值。

首先,关于递归深度,递归提供了一个简单的定义。如果调用Fibonacci(),当n为1或2时Fibonacci(n)应返回1;对于其他数值应返回Fibonacci(n-1)+Fibonacci(n-2);

long Fibonacci(n)

{

if (n> 2)

return Fibonacci(n-1)+Fibonacci(n-2);

else

return 1;

}

然后是兔子总数问题。

有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后又生一对兔子,假如兔子都不死,每个月兔子对数为多少?

思考这道题的时候,如果你简单的推算一下,会发现兔子每个月的对数就是斐波那契数列。

第一个月:1对;

第二个月:1对;

第三个月:2对;

第四个月:3对:

第五个月:5对:

第六个月:8对;

……

我之前做这道题的时候,觉得思路很简单,就是从第三个月起,求每个月的兔子数时,只要把这个月的前两个月总数相加。

这是我之前的代码,用f1和f2表示月。:

#include

intmain()

{

intf1,f2;

intmonth,ct;

printf("请输入月份:");

scanf("%d",&month);

if(month<=2)

printf("两只。\n");

if (month> 2)

{

f1=f2= 1;

ct= 0;

while(ct

f1=f1+f2;

ct+= 1;

f2=f1+f2;

ct+= 1;

}

if (month%2 == 0){

printf("第 %d 个月的兔子对数为:%d.\n",month,f2);

}

if (month%2 == 1){

printf("第 %d 个月的兔子对数为:%d.\n",f1);

}

}

return 0;

}

其实这个代码离递归就差一步,很接近了。但是我当时完全没有想到。

这是我重新修改之后的代码:

#include

long Fibonacci(n)

{

if (n> 2)

return Fibonacci(n-1)+Fibonacci(n-2);

else

return 1;

}

intmain()

{

longnum;

intmonth;

printf("请输入月份:");

scanf("%d",&month);

num= Fibonacci(month);

printf("这个月的兔子对数为%d.\n",num);

return 0;

}

只是很简单的修改,但是代码就整洁易懂了很多,也学到了新内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值