C语言Day6学习笔记

文章介绍了C语言中函数递归的基本概念,包括递归的终止条件和递归操作。通过实例展示了如何使用递归计算阶乘和解决斐波那契数列问题。同时,提到了递归可能导致的性能问题,并提出了利用数组存储中间结果以优化计算性能的方法。
摘要由CSDN通过智能技术生成

C语言Day6学习笔记

函数的递归思想

1、递归的概念:

递归作为一种算法在程序设计语言中广泛应用,是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。递归算法的实质将原来的问题转化为更小的同一问题,然后递归调用方法来表示问题的解。

2、递归的要素:

明确递归的终止条件

提取重复的逻辑,缩小问题的规模不断递去

给出递归终止时的处理办法

例(一个典型的递归函数):

int eatPeach(int day) {
    // 递归终止的条件
    if (day == 1) {
        return 1;
    }
    // 递归操作
    return 2 * (eatPeach(day - 1) + 1);
}

3、我对于对于递归的理解:递归的思想说白了就是把大事化小,小事化了。在我们遇到的问题中,往往有一类问题是对于一个大的问题,我们可以把它划分为一些子问题,这些子问题往往可以通过不断的重复递去,然后到达一个最原始的子问题,通过把这个过程再次归还回来,就可以解决原本的问题,也就是说,我们在运用递归思想解决这一类问题时,首先要明确一个重复的做法,也就是缩小问题,再通过条件的约束,让他结束重复,然后进行返回,一步一步解决问题。

下面给出用递归思想计算阶乘的办法

// 求n的阶乘
int f(int n) {
    // 递归终止的条件
    if (n == 1) {
        return 1;
    }
    // 递归操作
    return n * f(n - 1);
}

除此之外,还可以用递归思想解决一个著名的问题——斐波那契数列

但是在程序运行时,发现在用递归思想解决该问题时,常规的计算中会出现多次重复计算,导致程序运行速度大打折扣,降低了性能,甚至在计算后面的某一项时,会出现程序崩溃的情况,该问题的解决方案如下

int arr[50] = {0}; // 声明数组,用来保存计算结果的
int fib(int n) {
if (n==1 || n==2) { // 递归终止的条件
return 1;
}
if (arr[n]==0) { // 如果没有计算,就进行计算并保存计算结果
arr[n] = fib(n - 1) + fib(n - 2);// 将原问题转化为较小的同一问题
}
return arr[n];
}

实际的解决办法就是,定义一个数组,用来保存已经计算好的结果,在下次计算时就不用重复计算了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值