#include <stdio.h>
#include <stdlib.h> int recursion(int); int S = ; int main(void) {
recursion();
system("pause");
return ;
} int recursion(int i) {
printf("i:%d S为%d\n",i,S);
if (i > ) {
return S += recursion(i - );
printf("返回到%d", S);
}
else return ;
}
stdlib.h提供system()函数原型

第4行代码是函数声明,这样就不需要把子函数定义代码写在main()前面了

第6行是全局变量

点我看详细介绍

请跟着本教程调试,因为纯看文字不仅看不懂还头疼,动手才能理解(都怪楼主文字表达能力极差emm...)

 我们把断点打在第15行,然后就“逐语句调试”

关于调试按钮的介绍:

Continue 是执行到下一个断点处时才暂停,对于这里的递归函数,下一个断点还是第15行那条语句

F10逐过程(不进入函数内部,一个函数是一个过程)

F11逐语句(进入函数里的每一条语句)

若要跳出函数按shift+F11

Watch Auto 两个监视窗口都可以看变量值

回到调试递归函数这里,在第15行打断点,然后一直点下一步(这方法也叫单步调试)

然后我们可以发现:

函数会执行到递归处,因为递归在return之前执行,所以函数一直调用自己执行但不返回(只有到被调用的函数执行到结尾return,也就是结束了,才能继续执行上一层函数的return),直到20行的return 1;被执行了,这样有一个函数返回了(也就是最深处被调用的函数执行到了结尾处),然后次深处的函数才能继续执行到return 也就是次深层函数自己的结尾。

也就是函数递归调用自己,只要没有return,函数就没有执行完成(另外return void其实也算是一种return ),

所有的函数都在等待自己调用的那一个函数执行完成,

【仿佛一个公司,上级先做一部分事情,再分配其中一些关键任务给下级  并等待下级执行完成,下级完成后他们才能继续做这件事。上级有自己的上级和下级,下级也有自己的上级和下级,emmm...】

关于这句return S += recursion(i - 1);

只有recursion(i-1)执行完成后并返回了一个值X,系统才能把S的值加上返回值X再赋值给S

PS. return是函数的结尾,因此如果return后面还有语句,那也是无效的,return后面的语句根本不会被执行

结论:函数在没有return之前是不会结束的,递归利用这个特性,不断调用着自己,直到最后一个自己的分身return结束了,才能回到上一层继续执行,然后逐层return,最后回到最开始时那个函数
单数字表示第n层递归函数,数字加r表示第n层函数执行结束

            4r
3r
2r
1r

 




本文结束,以下是一些无关的事物:
其实,我们对调试一无所知,GDB调试打印大法:为什么一般调试程序bug的时候,都用printf来调试(printf大法),cout不行吗? - Renleilei92的回答 - 知乎
以及汇编 宏 Linux编程,这一切的一切,和C语言相关的东西,我们都一无所知,甚至Github我们都不知道怎么用,我不经会想,如果仅靠大学课堂,我们能懂什么?




而且大学计算机教材是一如既往的烂到底,把一门工科变成纯理科,凡是知识决口不提它的用处妙处,先要求你强制学会再说。就如二叉树,
教材里一开门就直接讲了二叉树的样子,像极了数学题,全然不告诉你它的用处妙处,而我在<C Primer Plus 中文版>书里看到的却是:
不太记得了,概况一下就是 现在需要从一个有顺序的列表里找到一位顾客的信息,这列表里有A到Z排序的顾客名字,对于一个排好序的列表可以用折半搜索(二分法)比顺序搜索好得多
假如列表有127项,那么顺序搜索平均要64次比较,而折半搜索只需最多7次比较 (2的7次方是128)
这样我们发现效率极高 但是这样有个坏处,每次加入新内容,列表都要排序一下,如果在需要频繁改动列表的情景下,这种顺序表(无论是数组还是单链表)会很麻烦。 另一种形式,二叉树,可能正是您所需要的。
二叉树结合了折半搜索策略的链接结构,如图

这本书基本上以应用为情景,带读者学习,很真实地模拟了一个需求场景,并坚持不懈地带着读者理解并学习各种新东西(最重要的是这本书内容全面完整,关键点细讲不会让你迷迷蒙蒙)
读了这本书,我真的觉得,学习一定要有一本好书,不好的书只会让你一头雾水并丢失学习的热情 这本适合c语言入门,另外数据结构的书还有很多,找书我一般在知乎看别人回答推荐 附上:

深入理解计算机系统(二):Hello World 是如何运行的 - 知乎


递归函数详解——VS调试教你理解透彻递归的更多相关文章

  1. JVM的垃圾回收机制详解和调优

    JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...

  2. Python 递归函数 详解

    Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...

  3. Mysql加锁过程详解(7)-初步理解MySQL的gap锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  4. 【Kafka】Kafka-配置参数详解-参数调优

    Kafka-配置参数详解-参数调优 kafka 目录_百度搜索 为什么kafka使用磁盘而不是内存 - CSDN博客 Kafka 配置说明 - 風吹云动 - 博客园 kafka生产服务器配置 - Or ...

  5. Python 递归函数详解

    递归函数的概念: 直接或间接的调用自身的函数,称为递归函数. 每调用一次自身,相当于复制一份该函数,只不过参数有变化,参数的变化,就是重要的结束条件 下面是一个递归函数的实例: #coding=utf ...

  6. 【Android面试查漏补缺】之Handler详解,带你全面理解Handler消息机制

    在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一.题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQue ...

  7. Java垃圾回收机制详解和调优

    gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集 ...

  8. 详解Vuex常见问题、深入理解Vuex

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态?我把它理解为在data中的属性需要共 ...

  9. C#委托的定义 以及使用方式详解,更简单的理解委托。

    委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得 ...

随机推荐

  1. 软件 ---- intelij IDEA安装

    官网下载, 下载地址: https://www.jetbrains.com/idea/download/#section=windows 版本说明:Ultimate 为旗舰版,功能全面,按年收费,这个 ...

  2. jQuery 源码分析(四) each函数 $.each和$.fn.each方法 详解

    $.each一般用来遍历一个数组或对象,$.fn.each()就是指jQuery实例可以执行的操作(因为$.fn是jQuery对象的原型) $.each用来遍历一个数组或对象,并依次执行回掉函数,最后 ...

  3. fastadmin表单提交后却没有关闭弹窗

    点击操作按钮弹出窗口,操作完之后提交表单,无论操作成功还是失败,窗口都不关闭,操作之后出现一个笑脸,3秒后回到弹框刚打开的样子 而我们想要的是这个效果: 在jS那里给这个按钮绑定一个事件即可实现

  4. DNA Sorting POJ - 1007

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 114211   Accepted: 45704 De ...

  5. Linux入门——初识Linux

    Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...

  6. tf.where()函数的解析

    tf.where()的使用,该函数会返回满足条件的索引.经验证,发现返回均是二维矩阵,可以说明该函数用二维矩阵给出满足条件的位置索引.(若有错误,欢迎指正.) 代码如下:import tensorfl ...

  7. Asp.Net MVC控制器获取视图传值几种方式

    前台表单(V:视图) @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="v ...

  8. 深入理解Vue组件3大核心概念

    摘要: 搞懂Vue组件! 作者:浪里行舟 原文:详解vue组件三大核心概念 Fundebug经授权转载,版权归原作者所有. 前言 本文主要介绍属性.事件和插槽这三个vue基础概念.使用方法及其容易被忽 ...

  9. maven 学习---Eclipse构建Maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  10. [Caliburn.Micro专题][1]快速入门

    目录 1. 什么是Caliburn.Micro? 2. 我是否需要学习CM框架? 3. 如何下手? 3.1 需要理解以下几个概念: 3.2 工程概览 3.3 示例代码 开场白:本系列为个人学习记录,才 ...