7.6 函数的递归调用

这篇具有很好参考价值的文章主要介绍了7.6 函数的递归调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归

 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归

直接调用:

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归

### 1. 直接递归调用

直接递归调用是指一个函数直接调用自己。例如,计算阶乘的函数,可以使用递归方法:

int factorial(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

在这个例子中,`factorial` 函数在其函数体内直接调用了自己,这就是直接递归。

间接调用:

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归

 

2. 间接递归调用

间接递归调用是指函数A调用函数B,然后函数B再调用函数A。这也称为循环递归。

考虑以下的例子:

void funcA(int n);
void funcB(int n);

void funcA(int n) {
    if (n <= 0) return;
    printf("From funcA: %d\n", n);
    funcB(n-1);
}

void funcB(int n) {
    if (n <= 0) return;
    printf("From funcB: %d\n", n);
    funcA(n-2);
}

在这个例子中,`funcA` 调用 `funcB`,然后 `funcB` 又调用 `funcA`,形成了一个间接递归的调用链。

### 注意事项

- 无论是直接递归还是间接递归,都应确保有一个明确的退出条件(或称为基线条件)。否则,递归调用可能会无限制地继续,导致栈溢出。

- 递归(无论是直接还是间接)通常会增加额外的时间和空间开销,因为每次函数调用都需要在内存中分配空间来保存返回地址、局部变量等。因此,当非递归方法同样简洁且易于理解时,通常推荐使用非递归方法。

- 递归的优点在于其可读性和解决某些问题的直观性。当面对某些特定问题(如树和图的遍历)时,递归方法通常更加直观。

了解这些概念后,你可以更有效地使用递归,并了解其背后的逻辑和潜在的陷阱。

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归 

 总结:  

### 重点:

1. **定义**:递归是一种编程技巧,函数在其定义中直接或间接地调用自身。

2. **基线条件**:为了避免无限递归,必须有一个或多个条件决定何时停止递归调用,这被称为基线条件或递归出口。

3. **子问题分解**:递归的核心思想是将问题分解为更小的、相似的子问题。子问题应该是原始问题的一个简化版本。

### 难点:

1. **思维模式**:递归需要一种不同的思维模式,即能够自然地将问题分解为子问题。这需要练习和经验来掌握。

2. **调试**:由于递归函数可能有多个执行实例同时存在(每次调用都会产生一个新实例),调试递归函数可能比非递归函数更复杂。

3. **效率问题**:递归函数在某些情况下可能效率较低,特别是当它重复计算相同的子问题时(例如,简单的斐波那契递归实现)。

### 易错点:

1. **缺少基线条件**:忘记为递归函数提供适当的基线条件会导致无限递归,最终可能导致栈溢出。

2. **不恰当的基线条件**:选择的基线条件不恰当或逻辑错误,可能导致函数不返回预期结果。

3. **不正确的递归逻辑**:子问题的递归调用逻辑错误会导致错误的输出或无法达到基线条件。

4. **栈溢出**:深度递归可能会导致栈空间耗尽,从而导致栈溢出错误。

5. **空间复杂度**:由于递归使用栈存储每次函数调用的信息,深层次的递归调用可能会导致大量的内存使用。

6. **重复计算**:在某些递归实现中,可能会多次计算相同的子问题,从而浪费计算资源。

了解这些重点、难点和易错点有助于更好地理解、设计和调试递归函数。递归是一个强大的工具,但使用时要小心。

7.6 函数的递归调用,夏驰和徐策带你从零开始学C语言,C语言,递归文章来源地址https://www.toymoban.com/news/detail-690940.html

到了这里,关于7.6 函数的递归调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ lambda表达式函数递归调用简单写法实现

    在C++11中,lambda表达式函数递归往往会带上 functional 头文件。书写形式如下: 还有相对简单点的第二种写法(C++14): 对于第二种, auto fib 的作用是为了在 lambda 表达式内部能够递归调用自身。在 C++14 中,lambda 表达式默认是无法直接递归调用的,因为在 lambda 内部无法访问到

    2024年02月15日
    浏览(51)
  • C //练习 4-12 运用printd函数的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数转换为字符串。

    练习 4-12 运用printd函数的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数转换为字符串。 注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。 IDE工具:Visual Studio 2010   代码块:

    2024年01月18日
    浏览(75)
  • Py:代码性能分析之使用python工具—如利用cProfile【输出每个函数的运行时间和调用次数】/line_profiler【输出每行代码的执行时间】)同时对比斐波那契数列问题的递归方法和动态规划

    Py:代码性能分析之使用python工具—如利用cProfile【输出每个函数的运行时间和调用次数】/line_profiler【输出每行代码的执行时间】)同时对比斐波那契数列问题的递归方法和动态规划算法实现 目录

    2024年02月04日
    浏览(81)
  • 将递归函数转成非递归函数的通用方法

    看到过一道非常不错的面试题:不支持递归的程序语言如何实现递归程序? 之所以说这道题好,是因为: 首先,它不是纯粹考概念和死记硬背,求职者在回答问题之前需要进行一定的思考; 其次,这道题目可以继续深挖,比如可以让求职者具体写一个程序,就变成了一道编

    2024年02月08日
    浏览(38)
  • 【JAVA】方法的使用:方法语法、方法调用、方法重载、递归练习

    🍉内容专栏:【JAVA从0到入门】 🍉本文脉络:JAVA方法的使用,递归练习 🍉本文作者:Melon_西西 🍉发布时间 :2023.7.19 目录 1. 什么是方法(method) 2 方法定义 2.1 方法定义语法格式  例子:两个数相加 例子:判断某一年是否为闰年并调用判断函数  2.2 方法定义注意事项 3 方法

    2024年02月14日
    浏览(46)
  • 深入理解递归函数与可控递归的应用

    什么是递归函数 递归函数的本质与循环的关系 递归函数的特点与优势 可控递归的要素 使用C语言详细举例说明可控递归 注意事项:递归层数限制与堆栈溢出问题 递归函数是指函数自己调用自己的过程。在C语言中,通过递归调用,函数能够重复执行某个任务,直到满足特定

    2024年02月12日
    浏览(29)
  • 函数-函数递归及练习

    目录 1、什么是递归? 2、递归的两个必要条件 3、递归的练习  3.1 接受一个整型值(无符号),按照顺序打印它的每一位 3.2 编写函数不允许创建临时变量,求字符串的长度  3.3 求第n个斐波那契数 3.4 字符串逆序(递归实现)  总结 程序调用自身的编程技巧称为递归(

    2024年02月02日
    浏览(41)
  • 【C语言】——函数递归,用递归简化并实现复杂问题

    不多废话了,直接开始。 递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的方法,在C语言中,递归就是函数调用自己。 写⼀个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式

    2024年02月05日
    浏览(41)
  • 【C语言】——递归函数,用递归简化并实现复杂问题

    不多废话了,直接开始。 递归是学习C语言函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的方法,在C语言中,递归就是函数调用自己。 写⼀个史上最简单的C语言递归代码: 上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式

    2024年02月03日
    浏览(36)
  • 「算法小记」-1:Ackermann函数/阿克曼函数的一点思考解法【递归/非递归/堆栈方法】(C++ )

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《算法小记》系列专栏,该专栏记录了许

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包