C语言函数的递归和调用
函数记住两点:
(1)每个函数运行完才会返回调用它的函数;每个函数运行完才会返回调用它的函数,因此,你可以先看看这个函数不自我调用的条件,也就是fun()中if条件不成立的时候,对吧,不成立的时候就是N==0的时候,所以返回;
(2)还有一点就是函数实参传给形参之后,形参的变化是不会改变原实参的值的。
c语言函数递归调用的问题
#include <stdio.h>
void fun(int);
int main()
{
int a = 3;
fun(a);
printf("\n");
return 0;
}
void fun(int n)
{
if(n>0)
{
fun(--n);
printf("%d", n);
fun(--n);
}
}
解释答案为什么是0120
过程分析: |
理解C语言递归函数的逐级返回(return)
递归函数,也即调用自身的函数。
C Primer Plus中有个例子很棒:
/*理解C语言递归函数*/
#include<stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("level %d: n loacation %p\n", n, &n);/*1*/
if (n < 4)
up_and_down(n + 1);
printf("level %d: n loacation %p\n", n, &n);/*2*/
}
该段代码中,up_and_down不断调用自己,输出如下结果:
相信输出level1、level2、level3、level4,很好理解,但是为什么还会输出level4、level3、level2、level1呢?
原来,在第一次输出level4之后,函数不再继续调用up_and_down()函数,而是执行return语句,此时第四级调用结束,把控制返回给函数的调用函数,也就是第三级调用函数,第三级调用函数中前一个执行过的语句是在if语句中进行第四级调用,因此,执行其后续的代码,也就是语句#2,这将会输出level3。第三级调用结束后,第二级调用函数开始继续执行,即输出了level2,以此类推。
为了加深理解,把语句#1注释掉,结果如下:
只把#2语句注释掉,结果如下:
根据之前所述执行过程,这两个结果很容易解释,程序不能直接返回到main()中的初始调用部分,而是通过递归的每一级逐步返回。
C语言函数的递归和调用的更多相关文章
- c语言函数, 函数调用及函数递归
1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的. 函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...
- [C++程序设计]函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用 该函数本身,称为函数的递归(recursive)调用. 包含递归调用的函数称为递归函数. 在实现递归时,在时间和空间上的开销比较大 求n! #includ ...
- c语言:函数的递归调用
c语言可以将代码模块化,这是其很重要的一个特性. 说道代码模块化,我们很自然的就会联想到函数.而函数中,比较难的一个知识点就是函数的递归调用. 值得注意的是,函数的递归调用在现实工作并不是很常用,但是 ...
- C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质
事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一 ...
- c语言程序设计案例教程(第2版)笔记(二)—函数、递归
零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化. 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题:还可以提高程序代码的重用性. 函数:函数是构成C程序的基本单位.函数 ...
- 从linux0.11中起动部分代码看汇编调用c语言函数
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...
- 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用
5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...
- keil or c51 汇编调用c语言函数 容易忽视的问题
最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...
- C51函数的递归调用
前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...
随机推荐
- 项目记事【SpringMVC-2】:将后台的对象,转成JSON报文
Spring版本:3.2.7 Jackson版本: <!--Jackson --> <dependency> <groupId>com.fasterxml.jack ...
- 【Luogu】P2150寿司晚宴(状压DP)
题目链接 反正……我是没什么想法了,全程看题解 (或者说自己想了半天错解) 因为大于根n的质数最多只会在一个数里出现一种,所以可以把数拆成两部分:小数的二进制集合和大数. 然后把大数一样的放到一起DP ...
- cf- 297 < b > -- 区间翻转操作的优化
B. Pasha and String time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- springboot获取getBean方法以及ApplicationContext空指针问题解决
创建获取ApplicationContext工具类: package com.performancetest.common.utils; import org.springframework.bean ...
- IOs动画的那些事儿
CoreAnimation介绍 1:Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animatio ...
- Linux System Programming 学习笔记(八) 文件和目录管理
1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是L ...
- windows.open 以post的方式传递参数
今天看到有篇文章寫到 windows.open 可以post方式傳遞參數,就趕緊照作看看,結果是可行的,感謝撰寫這篇文章的作者~ /** * window.open with post method ...
- 【POJ3498】March of the Penguins(最大流,裂点)
题意:在靠近南极的某处,一些企鹅站在许多漂浮的冰块上.由于企鹅是群居动物,所以它们想要聚集到一起,在同一个冰块上.企鹅们不想把自己的身体弄湿,所以它们在冰块之间跳跃,但是它们的跳跃距离,有一个上限. ...
- 标准C程序设计七---51
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- AC日记——合唱队形 洛谷 P1901
题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...