c语言递归1到10联程,为什么这个递归能输出1到10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先你的main函数调用printN,作为调用者他会做这么几件事
1.将参数10压栈;
2.将Return Address压栈,即第19行的地址;
3.跳转到函数体;
在函数体中,作为被调用者他会做这么几件事:
......初始化操作......
if N != 0
将N-1压栈,
将Return Address压栈,即第6行的地址,
然后跳转到函数体;
打印N的值;
else
......恢复操作.....
函数返回;
当N=0时,栈帧类似下面的情况:
------------------------
saved ebp(下方栈帧的ebp地址)
------------------------
return address
------------------------
N=0
------------------------
saved ebp (下方栈帧的ebp地址)
------------------------
return address (EBP+4)
------------------------
N=1 (EBP+8)
------------------------
.....
------------------------
saved ebp
------------------------
return address
------------------------
N=9
------------------------
saved ebp (main函数栈帧的ebp地址)
------------------------
return address
------------------------
N=10
------------------------
....
------------------------
当N=0时,并且if执行完成后,会:
1.恢复esp(销毁局部变量),弹出ebp(ebp为下面栈帧的地址);
2.跳转到返回地址
然后执行返回地址+1处的代码,打印出N=1(因为ebp已经恢复,参数就是EBP+8这个位置的元素 );
...依次类推...
最后返回main函数的栈帧继续执行;
c语言递归1到10联程,为什么这个递归能输出1到10相关推荐
- 知识库递归编程java和prolog代码;逻辑语言Prolog简介(附24555字PDF发“递归prolog简介”下载)
知识库递归编程java和prolog代码:逻辑语言Prolog简介(附24555字PDF发"递归prolog简介"下载) 数据简化DataSimp 今天 数据简化DataSimp导 ...
- ACMNO.37 C语言-数字交换 输入10个整数,将其中最小的数与第一个数对换,然后把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
题目描述 输入10个整数,将其中最小的数与第一个数对换,然后把最大的数与最后一个数对换. 写三个函数: ①输入10个数:②进行处理:③输出10个数. 输入 10个整数 输出 整理后的十个数,每个数后跟 ...
- c语言递归函数变量作用域,C语言课程变量的作用域和生存周期、递归.ppt
C语言课程变量的作用域和生存周期.递归 函数的定义和函数的调用 函数定义格式: 返回值类型 函数名(类型 参数1,类型 参数2,-) { 函数体 return 表达式; } 函数调用格式: 函数名(参 ...
- 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)
给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...
- 给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)
给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出 (算法导论第十章10.4-2) #include <iostream> template<typena ...
- 学习笔记9-C语言-传参、类型限定符、递归
函数传参: 1.形参变量属于它所在的函数,出了该函数就不能使用 2.实参与形参之间都是以赋值的形式进行数据传递(值传递) 3.return 其实是把返回值数据放置到一个公共的区域(函数和函数调用者), ...
- c语言输入10个数从小,C语言中,从键盘输入10个数,从小到大排列输出,怎
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:C语言中,从键盘输入10个数,从小到大排列输出,怎么写啊,最好注回答:#includestdio.h void swap(int * ...
- 1个球从100m落下,每次时,反跳原高度的一半,再落,再反弹,求第10次落地共经过多少m,第10次反弹多高。 谭浩强《c语言程序设计》第五章第十一题
题目 本题是谭浩强<c语言程序设计>第五章第十一题 题目:1个球从100m落下,每次时,反跳原高度的一半,再落,再反弹,求第10次落地共经过多少m,第10次反弹多高. 提示:以下是本篇文章 ...
- php (0.1 0.7)10,int((0.1 + 0.7)* 10)= 7在几种语言。 如何防止这一点?
int((0.1 + 0.7)* 10)= 7在几种语言. 如何防止这一点? 最近我遇到了几种语言的错误/function. 我有一个非常基本的知识,它是如何引起的(我想要一些详细的解释),但是当我想 ...
- 杨辉三角形递归c语言,关于【杨辉三角】的递归解决方法,请教。有没有大神【【高手】】...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [问题在于,最前面的是输出的只占有一个字符,但是后面的都是占有4个字符位!这怎么解] 在7-1题,我们输出的数字三角形,叫做杨辉三角形,是二项式的系数,当 ...
最新文章
- python 文件保存读取时不用with的问题
- codis 部署和测试
- 第九章 结构体与共用体
- SAP Intelligent Robotic Process Automation权限控制
- LwIP之网络接口管理
- python ant_python3.7.1ant+TKinter在Tkin中显示来自ANT+设备的实时数据
- CS0016错误解决汇编
- 游戏开发所需要看的书
- 社会工程学主要学习内容及书籍推荐
- 项目质量管理的几种常规方法
- 吃透Kafka六:topic 创建过程
- android v2签名机制,APK签名机制之——V2签名机制详解
- pythonfor反向循环_python如何实现反向迭代
- 巴旦木树苗适合在哪些地方种植?巴旦木苗木成长过程
- 手机拍照技巧(一:校园拍摄)
- 颜体html标签,颜体楷书笔法32式详解,一定不能错过!(超级干货)
- 记一次神奇的CVPR 2021 Rebuttal 经历
- shader学习之路——更复杂的光照之Base Pass 和 Additional Pass和光照的衰减
- docker 雷电模拟器
- 当税收遇到了电商 团购网站遭遇尴尬
热门文章
- RPi 2B Raspbian system install
- HTML学习基础教程
- 01背包 Codeforces Round #267 (Div. 2) C. George and Job
- 淘宝TOP获取sessionkey
- Imc手机连环画PC阅读器
- perl--CGI编程之Apache服务器安装配置
- [公告]积分算法问题改正
- php vm_facebook hiphop php vm 兑现概述(二)
- html语言添加点击事件,vue 中拼接html时添加点击事件
- 重构Webpack系列之一 ---- 概念篇