什么是递归?
程序调用自身的编程技巧称为递归(recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
递归的必要条件
存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件
这里我们利用一个程序来帮助我们了解递归
要求:接受一个整型值(无符号),按照顺序打印它的每一位。
例如:输入:1234,输出 1 2 3 4
代码:
#include <stdio.h>
void print(unsigned int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
unsigned int num = 1234;
print(num);
return 0;
}
这里我们首先定义变量 num 并给予初值 1234 ,
然后把它传给 print 函数,让 print 帮助完成。
之后我们写 print 函数,根据一开始的概念和条件编写,首先递归需要限制条件,所以我们给出 if(n > 9) ,来防止print无线递归,直到错误。之后如果满足 if 语句进入,执行print(n / 10),最后执行 printf 打印 n 的余数
现在我们带入数据,当 1234 进入函数print时,判断 1234 > 9,进入,调用 print函数 ,这时,n = 123 (因为括号要求n除10)
然后我们发现,我们需要再一次调用 print函数,然后我们再判断 123 > 9,这时 n = 12
然后我们发现,我们还要调用 print函数 ,再次判断 12 > 9,这时 n = 1
然后我们发现,我们又要调用 print函数,之后我们发现 1 < 9 ,不需要再执行 if语句 了
这时我们执行 printf 打印 n%10 的值 ,也就是 1,然后我们回到上一个 print函数 ,执行printf 打印 n%10,也就是2,然后再回到上一个 print函数,打印 n%10 ,也就是3 ,最后我们回到第一个 print函数 ,执行 printf 打印 4
所以我们得到结果:1 2 3 4
这就是一个简单的函数递归
在这里我们发现,我们每次递归时,都会使调用后的值(如:123 12 1)更接近我们的限制条件(if(n>9)),而这也正好满足了我们第二个递归必要条件
每次递归调用之后越来越接近这个限制条件
注:递归不能太深入,否则会导致栈溢出(可以简单的理解成,存放函数值的内存满了。
因为上一个函数还没有结束,又执行下一个函数,而没有结束的函数会暂时存放在栈区,而栈区的空间是有限的,不可能一直存放,如果递归越来越深入,就会引发栈溢出,而导致程序错误)