C语言 之 函数递归

C语言 之 函数递归**一,什么是函数递归** **C允许函数调用它自己这种调用过程称为递归** **比如,递归方案更简

大家好,欢迎来到IT知识分享网。

C语言 之 函数递归

C语言之函数递归

一,什么是函数递归

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;

为什么呢

C语言 之 函数递归

原理图

我们来仔细分析一下程序中的递归是如何工作的

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;

以此类推

C语言 之 函数递归 图文无关

四,注意

//每级递归的变量n都属于本级递归私有,

Level和LEVEL的地址是一样的

C语言 之 函数递归

原理图

最后总结一下函数递归的基本原理

C语言 之 函数递归

图文无关

三,函数递归的基本原理

1,每一级函数调用都有自己的变量,也就是说第一级的n和第二级的n不同,(1,2,3,4级的函的n 值不同)

2,每次调用函数都会返回一次,当函数执行完毕后,控制权将被传回上一级递归,程序必须按照顺序逐级返回递归。

从某一级的up()函数(假如说第四级)返回上一级up()函数(第三级)不能直接跳回到main()中的第一级调用

*3,递归函数位于递归调用之前的语句,均按被调函数的顺序执行,例如:#1位于递归调用之前,他就按照递归的顺序执行顺序:

第一级第二级第三级第四级

*4,递归函数中位于递归调用之后的语句,均按照被调函数相反的顺序执行—,

例如;打印#2的语句时,打印顺序是

第四级第三级第二级第一级

5,虽然每级递归都有自己的变量,但是并没有拷贝函数的代码,

程序按照顺序执行函数中的代码时,而递归调用就相当于又从头开始执行函数的代码,(就是又从main执行了一次)

//除了每次递归调用创建变量外,递归调用非常类似于一个循环语句

实际上,递归有时可以用循环来代替,循环有时也能用递归来代替

注意:

递归函数必须包含能让递归调用停止的语句,

通常,递归函数都使用if或其他等价的测试条件在函数形参等于某特定值时终止递归

//递归函数如果没有停止语句的话,

会一直执行下去

好了今天就为大家带来这些

谢谢大家

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/88495.html

(0)
上一篇 2024-10-13 13:45
下一篇 2024-10-14 15:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信