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

2023年 7月 13日 40.9k 0

自己对递归还是不太熟练,于是做的时候就很吃力,就是翻棋子直到棋盘上所有棋子的颜色一样为止,求最少翻多少次,方法是枚举递归。然后就打算先做另一道递归的题(从数组中取出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
  • int main()
  • {
  • int f1,f2;
  • int month,ct;
  • printf("请输入月份:");
  • scanf("%d",&month);
  • if(month 2)
  • {
  • f1 = f2 = 1;
  • ct = 0;
  • while(ct 2)
  • return Fibonacci(n-1)+Fibonacci(n-2);
  • else
  • return 1;
  • }
  • int main()
  • {
  • long num;
  • int month;
  • printf("请输入月份:");
  • scanf("%d",&month);
  • num = Fibonacci(month);
  • printf("这个月的兔子对数为%d.\n",num);
  • return 0;
  • }
  • 只是很简单的修改,但是代码就整洁易懂了很多,也学到了新内容。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论