开发者学堂课程【你的第一门 C 语言课:递归】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5483
递归
内容介绍:
一、生活举例
二、递归案例
三、递归求阶乘
四、实现递归要满足两个基本条件
五、慎用递归
一、生活举例
递归在生活中的案例:
这个故事与今天的知识点——递归有点像。
递归的这个概念是属于算法的范畴,本来不属于 C 语言的语法范畴,但是基本上在每个编程中都会讲到递归,那是因为如果掌握了递归的方法和技巧,就会发现是一个非常棒的编程思路,有时候绞尽脑汁都想不出的问题,用递归就可以轻松的实现。
例子:
1、汉诺塔游戏是来自于一位法国数学家曾经编写过的一个古老的印度传说,该游戏要求(将最左边的木块移动到最右边的柱子上去,每一步只能移动一块木块,并且只能小的木块在大的木块上面)
2、谢尔宾斯基撒三角形,一个大三角形里边分为很多个小三角形,一层接一层,只要空间够大,可以撑满整个小宇宙。
1、目录树的索引,在编程过程中会遇到目录索引访问的情景,需要一层一层的去访问目录,但不知道目录究竟有多少层,这时使用递归就是一个很好的方法。
2、女神的自拍。
递归的概念
递归从原理上来说,就是函数调用自身的行为。在函数内部可以调用其他函数,也可以调用其自身。
二、递归案例
函数调用本身(递归的实现)
#inc
l
ude
void recursion(void) ;
void recursion(void)
{
static int count = 10;
printf("Hi!\n") ;
if (--count)
{
recursion();
}
}
int main(void )
{
recursion() ;
return 0 ;
}
运行:gcc test1.c ss ./a.out
结果:
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi!
注意!
递归必须要有结束条件.否则程序将崩溃!
没有返回值就会出现异常,如同下面的情况,会一直重复出现 Hi 并且报错。
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
Hi
!
S
egmentation fault
三、递归求阶乘
写一个求阶乘的函数
——正整数阶乘指从1乘以2乘以3乘以4一直乘到所要求的整数。比如所给的数是5,则阶乘式是1X2X3X4X5,得到的积是120, 所以120就是5的阶乘。
5!=120
以此为例:
#include
.
h>
l
ong fact(int num) ;
l
ong fact(int num);
{
l
ong result;
if(num>0)
{
result = num * fact(num - 1);
}
else
{
result=1;
}
return result;
int main (void )
{
int num ;
printf("请输入一个正整数: ");
scanf("%d", &num) ;
printf("%d的阶乘是: %d\n", num, fact(num)) ;
return 0;
}
测试一下:
运行:
gcc test
2
.c ss ./a.out
结果:
请输入一个正整数:5
5的阶乘是:1
20
结果:请输入一个正整数:
10
10的阶乘是:3628800
执行流程:
1. 程序载入内存进入 main
2. 用户输入一个值
3. 调用第一次 fact(num)
4.进入执行,一层一层执行,直到返回的数不满足 num >0
- 假设我们的值传入是5,那么就拥有以下视图:
一层一层调用,直到不满足循环的条件就输出结果
递归递归,归去来兮,有去有来。
四、实现递归要满足两个基本条件
- 调用函数本身
- 设置了正确的结束条件
五、慎用递归
普通程序员用迭代,天才程序员用递归!
但我们宁可做普通程序员!!
以实现程序为目标。