欢迎大家来到IT世界,在知识的湖畔探索吧!
C语言之函数递归
一,什么是函数递归
C允许函数调用它自己这种调用过程称为递归
二,在什么地方使用递归?
通常使用循环的地方也可以使用递归。
但两者各有优缺点,
比如,递归方案更简洁,但效率却没有循环高
三.详细讲解一下递归的基本原理
先来串代码
#include<stdio.h>
void up (int);
int main (void)
{
up(1);
return 0;
}
void up (int n)
{
printf(“Level %d :\n”,n);//#1
if( n < 4)
up (n + 1);
printf(“LEVEL %d: n”,n);//#2
}
先编译一下,再运行。
如果知道函数原型,函数调用的朋友,
可能会说打印
Level 1:
Level 2:
Level 3:
Level 4:
但实际上,打印的是
Level 1:
Level 2:
Level 3:
Level 4:
LEVEL 4;
LEVEL 3;
LEVEL 2;
LEVEL 1;
为什么呢
我们来仔细分析一下程序中的递归是如何工作的
1,main()调用up()函数,执行的结果是up()中的形式参数n的值是1 所以打印第一句话 Level 1:
2,然后,由于n < 4;up()(第一级)调用实际参数为n +1 的up()(第二级), 于是第二级的n=2,打印Level 2: 以此类推
3,当执行到第四级时,n的值是4,所以if测试条件为假,
up()函数不再调用自己,执行下一条语句,打印LEVEL 4:
4,此时第四级调用结束,控制被传回它的主调函数(即第三级调用),
(这里解释一下,递归只能一级一级的返回)
在第三级调用中,执行的最后一条语句是调用if语句中的第四级调用,被调函数(第四级调用)把控制返回在这个位置,因此,第三级调用继续执行后面的代码,,
//也就是说,打印完LEVEL 4:后,
up()函数要返回到上一级,(up(4)的上一级是up(3))
所以,函数就返回到了up(3)(第三级)
所以打印LEVEL 3;
以此类推
图文无关
四,注意
//每级递归的变量n都属于本级递归私有,
Level和LEVEL的地址是一样的
最后总结一下函数递归的基本原理
三,函数递归的基本原理
1,每一级函数调用都有自己的变量,也就是说第一级的n和第二级的n不同,(1,2,3,4级的函的n 值不同)
2,每次调用函数都会返回一次,当函数执行完毕后,控制权将被传回上一级递归,程序必须按照顺序逐级返回递归。
从某一级的up()函数(假如说第四级)返回上一级up()函数(第三级)不能直接跳回到main()中的第一级调用
*3,递归函数位于递归调用之前的语句,均按被调函数的顺序执行,例如:#1位于递归调用之前,他就按照递归的顺序执行顺序:
第一级→第二级→第三级→第四级
*4,递归函数中位于递归调用之后的语句,均按照被调函数相反的顺序执行—,
例如;打印#2的语句时,打印顺序是
第四级→第三级→第二级→第一级
5,虽然每级递归都有自己的变量,但是并没有拷贝函数的代码,
程序按照顺序执行函数中的代码时,而递归调用就相当于又从头开始执行函数的代码,(就是又从main执行了一次)
//除了每次递归调用创建变量外,递归调用非常类似于一个循环语句
实际上,递归有时可以用循环来代替,循环有时也能用递归来代替
注意:
递归函数必须包含能让递归调用停止的语句,
通常,递归函数都使用if或其他等价的测试条件在函数形参等于某特定值时终止递归
//递归函数如果没有停止语句的话,
会一直执行下去
好了今天就为大家带来这些
谢谢大家
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/77837.html