自己对递归还是不太熟练,于是做的时候就很吃力,就是翻棋子直到棋盘上所有棋子的颜色一样为止,求最少翻多少次,方法是枚举递归。然后就打算先做另一道递归的题(从数组中取出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;

}

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

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

  1. c语言斐波那契数列递归数组,c语言斐波那契数列递归法

    斐波那契数列递归 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&quo ...

  2. c语言有一个已经排好的数组,C语言有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中...

    C语言有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插 入数组中 main() {inta[11]={1,4,6,9,13,16,19,28,40,100};inttemp1,temp2, ...

  3. c语言程序定义不知数量的一维数组,c语言程序设计10-第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组.ppt...

    c语言程序设计10-第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组 * 临沂大学汽车学院:韩晓翠 第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组 授课要点 数组的概念 一维 ...

  4. 算法:分治策略和递归1 | 通过迭代来学习递归

    文章目录 分治策略和递归 分治策略的步骤 示例1:阶乘问题 示例2:打印数组的值 示例3:在数组中查找目标值 分治策略和递归 分治策略: 是将规模比较大的问题可分割成规模较小的相同问题.问题不变,规模 ...

  5. c语言如何用指针操作一维字符数组,C语言中数组和指针的互操作

    C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减.当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有 ...

  6. 用递归调用法求斐波那契函数_进阶版:面试官问你斐波那契数列的时候不要高兴得太早...

    增加内容 递归改进版 矩阵快速幂解法 通项表达式解法 列表法 斐波那契数列应用 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归 ...

  7. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

  8. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  9. 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现

    文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...

最新文章

  1. 解决jupyter中无自己创建的虚拟环境
  2. 记真实自己,炫精彩人生---《爱记》app使用体验
  3. php中为什么要用heade定义头,有什么应用场景
  4. offset linux,Linux 宏定义之 offsetof 与 container_of(十九)
  5. FreeRTOS系列第2篇---FreeRTOS入门指南
  6. JDK源码分析:Byte.java
  7. 【文摘】 雪念——作者:蓝色妖姬
  8. centos 6 安装mysql,CentOS6.5安装MySQL教程(完整教程)
  9. ASP.NET Core 3.0 发布
  10. linux进程自动启动,linux 嵌入式 自启动 系统自动登录-自动启动程序或脚本
  11. adb shell操作文件
  12. C#给Winform的button等控件添加快捷键三种方法
  13. mono:利用wxWindows开发界面程序
  14. 云操作系统,是真的吗?(译文)
  15. 项目管理网络图概念总结
  16. 百度的疯狂 UC的隐忍
  17. [codeforces 1324C] Frog Jumps 一直向右+边界处理
  18. [转载] UEFI+GPT双硬盘安装Win10+Ubuntu16.04双系统
  19. 利用pandas读取Excel文件数据
  20. 剖析Mozilla代码之七武器

热门文章

  1. dep指定版本 go_Go 包管理工具-dep
  2. axure树形表格_Axure教程:可增删改的树型结构
  3. QT使用VLD检测内存泄漏
  4. PDM系统的产品结构管理与版本控制
  5. mysql的binlog意义_带你解析MySQL binlog
  6. Failed to create AppDomain 'xxx'. Exception has been Failed to create AppDomain
  7. Shell中判断文件,目录是否存在
  8. [UIImage resizableImageWithCapInsets:]使用注意
  9. SSH Tunnel扫盲(ssh port forwarding端口转发)
  10. iOS SQLite语法基础