五分钟走进斐波那契——C语言基础递归篇

简介: 应用👏递归与迭代,之前已经接触过n的阶乘,但代码显得比较老实,不能显现出C语言的灵活性,在引入递归后,我们就可以考虑更高级的情况。

应用👏

递归与迭代,之前已经接触过n的阶乘,但代码显得比较老实,不能显现出C语言的灵活性,在引入递归后,我们就可以考虑更高级的情况。


其实用循环去解决阶乘也很简单,无非就是n*(n-1)(n-2)……一直如此循环下去,而反过来思考更简单,直接产生1~n的数字再累计乘在一起,只需整一个乘等于的循环,我们这里引入递归;首先自义定一个函数Fac,Fac需满足阶乘要求,思路如下:

image.png

再撸上咱的代码,完美:

image.png

斐波那契数列👏

于是,咱就以此继续研究斐波那契数列。


概念👏

又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:


0、1、1、2、3、5、8、13、21、34、……


斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)


实现👏

首先根据斐波那契数列的判定标准构思出大致框架,斐波那契数列以递推的方法定义,这时我们要来描述斐波那契的第n个数时,假设用函数 Fib表示:

image.png

利用阶乘的基本框架主函数,撸上代码:

            //斐波那契数列
      Fib(int n)
      {
        if (n <= 2)
          return 1;
        else
          return Fib(n - 1)+Fib(n-2);//递归调用Fib函数
      }
      int main()
      {
        int n = 0;
        int ret = 0;
        scanf("%d", &n);
        ret=Fib(n);
        printf("ret = %d\n", ret);
        return 0;
      }

运行结果如下:

image.png

递归的两个必要条件,是不是都满足了就没有任何问题了呢?注意并不是只有那些死递归才会栈溢出,具体某些特定环境下也会造成堆栈。


要深入研究递归的,接下来我会出一期函数递归的经典题目:汉诺塔问题,青蛙跳台阶问题。


TDD👏

我在研究一个函数时我都先去写它该怎么用,然后再去实现这个函数,这种实现方式或设计思路称为 TDD(测试驱动开发)。


TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他开发方法和过程


那我们为什么需要TDD这玩意儿呢?


首先是需求分析,想不清楚细节,

管他呢,先开始写发现需求细节不明确,去跟业务人员确认

确认好几次终于写完所有逻辑

运行起来测试一下,靠,果然不工作,调试

调试好久终于工作了

转测试,QA 测出 bug,debug, 打补丁

终于,代码可以工作了

相关文章
|
15天前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
29 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
1天前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
6天前
|
C语言
C语言中的递归
C语言中的递归
|
1月前
|
存储 编译器 C语言
|
2月前
|
C语言
C语言--函数递归与迭代
C语言--函数递归与迭代
|
2月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
46 7
TU^
|
2月前
|
机器学习/深度学习 C语言
C语言之函数递归
C语言之函数递归
TU^
21 1
|
1月前
|
存储 算法 程序员
C语言编程—递归
递归是函数自我调用的编程技术,常用于解决分治问题,如计算阶乘和斐波那契数列。示例中展示了C语言的阶乘和斐波那契数列递归实现。递归需满足:问题可转化为规模更小的同类问题,存在结束条件以防止无限循环,并可能消耗大量时间和栈空间。栈用于存储函数调用信息,过多递归可能导致栈溢出。递归虽简洁,但非最优效率选择,递推算法通常是更好的替代方案。
29 0
|
2月前
|
C语言
【c语言】汉诺塔问题详解(c语言递归函数)
【c语言】汉诺塔问题详解(c语言递归函数)
14 0
|
2月前
|
C语言
【C语言】:递归题
【C语言】:递归题
23 0