C语言中的函数-函数的递归-学习笔记-17

引入递归

调用函数的过程中又出现直接或者间接调用函数本身,称为函数的递归调用
直接调用:

1
2
3
4
5
int test(int x){
int a,b;
b=test(a);
return(2*b);
}

这就是直接调用,即在本函数体内,再次调用其自身。

间接调用:

1
2
3
4
5
6
7
8
9
10
int test (int x){
int test2(int z);
int a,b;
b=test2(a);
return (2*b);
}
int test2 (int z){
int c=2*z;
test(c);
}

上面就是间接调用了,虽然函数体本身并没有调用自身函数,但是调用了其他函数,其他函数又掉用了其主调函数,这就是简介的进行递归。

发现问题
上面的递归调用都是无限执行,没有什么东西约束要不要继续进入下一次递归,所以我们一般使用 if...else...语句来判断函数是否继续进行递归。

举个例子 - 1

因为递归的感念不太好理解,我们举一个简单的例子:
有5个学生坐在一起:
第 5 个学生说比第 4 个大 2 岁;
第 4 个学生说比第 3 个大 2 岁;
第 3 个学生说比第 2 个大 2 岁;
第 2 个学生说比第 1 个大 2 岁;
第 1 个学生说自己是10岁。

理解

按照我们的思维惯例:
要知道第 5 个学生的年龄,必须知道第 4 个
要知道第 4 个学生的年龄,必须知道第 3 个
要知道第 3 个学生的年龄,必须知道第 2 个
要知道第 2 个学生的年龄,必须知道第 1 个
第一个是 10,然后往后每一个都比第一个大 2 。

用数学表达式可以写为
age(n) = 10 (n=1)
age(n) = age(n-1)+2 (n>1)

函数表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(){
int age(int n);
int z;
printf("请输入你要查询第几个学生的年龄:\n");
scanf("%d",&z);
printf("第%d个学生的年龄是:%d 岁\n",z,age(z));
return 0;
}

int age(int n){
int c;
if (n==1){
c=10;
} else{
c=age(n - 1)+2;
}
return (c);
}

执行过程如下图所示
IMG_0258

求第5个学生的年龄的话,age 函数共被调用 5 次,第一次 age(5) 是在 main 函数中,其余4次都是 age 函数本身在调用。

举个例子 - 2

用递归的方法求 n!

理解

n!可以用递推的方法,从1开始,乘2,乘3,…. ,一直乘到 n,这种方法容易理解,也容易实现。即从一个已知的事实向后推进。

数学表达式

n!= 1 ( n = 1 )
n!= n * (n-1) ! ( n > 1 )

函数表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main(){
int z;
int fac(int n);
printf(" 请输入一个数:");
scanf("%d",&z);
printf("%d!的结果是:%d\n",z,fac(z));
}

int fac (int n){
int q;
if (n<0){
printf("%d为非法数值,错误!",n);
} else if(n==0 || n==1){
q=1;
}else{
q=fac(n-1)*n;
}
return (q);
}

上面这个例子,我们看出,和例1差不多,都是有一定的规律,然后不断的进行演化,我们通过 n-1 来控制函数递归的次数,然后达到我们逐个深入再逐个回归的过程。

总结

用了两个例子来演示递归的使用方法和具体思路,希望不要跟函数的嵌套混淆。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!