引入递归
在调用函数
的过程中又出现直接或者间接调用函数本身
,称为函数的递归调用
。
直接调用:
1 | int test(int x){ |
这就是直接调用,即在本函数体内,再次调用其自身。
间接调用:
1 | int test (int x){ |
上面就是间接调用了,虽然函数体本身并没有调用自身函数,但是调用了其他函数,其他函数又掉用了其主调函数,这就是简介的进行递归。
发现问题
上面的递归调用都是无限执行,没有什么东西约束要不要继续进入下一次递归,所以我们一般使用 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 |
|
执行过程如下图所示
求第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 |
|
上面这个例子,我们看出,和例1差不多,都是有一定的规律,然后不断的进行演化,我们通过 n-1 来控制函数递归的次数,然后达到我们逐个深入再逐个回归的过程。
总结
用了两个例子来演示递归的使用方法和具体思路,希望不要跟函数的嵌套混淆。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。