所谓递归,就是程序不断地调用自身的编程技巧,注意 这里的调用是有尽的 如果无尽 则不能称之为递归,递归的目的就是将一个大型的复杂问题转化为与原问题相似的规模较小的问题求解,大大减少了代码量,递归的核心思想就是把大事化小。
递归的两个必要条件
存在限制条件,当满足这个限制条件时,递归结束
每次递归之后都会接近这个限制条件
也就是说 递归总是会结束的,如果你碰到无法结束的 那肯定不是递归
这里我们举几个例子说明一下
eg1:接收一个整型值(无符号),按照顺序打印它的每一位
首先要知道无符号和有符号正型值的区别 无符号(unsigned int)不包含负数,而有符号(int)包含负数。
我们看一下参考代码
#include <stdio.h>
void ValuePrint(int n)
{
if(n>9)
{
ValuePrint(n/10);
}
printf("%d ",n%10);
}
int main() {
unsigned int num=0;
scanf("%u",&num);
ValuePrint(num);
return 0;
}
我们自定义一个输出函数ValuePrint(),里面的参数就是要输入的数字,如果这个数字大于9,也就是两位数以上,那么就再次调用本函数,不过调用之后的参数值就变成了/10所得的参数值,下面我们以 数字1234为例分析一下。
首先输入1234,scanf接收到数字1234,开始调用ValuePrint函数,因为1234>9,所以在ValuePrint函数内部再次调用ValuePrint函数自己,这次函数的参数就变成了1234/10,也就是123;接着123>10,再次调用这个函数,这次函数参数值变成了123/10,即12;12>9,再次调用,参数变成1;ok这次因为1<9,不会再调用了,也就是走if另一个情况,打印1%10的结果,也就是1,由于main中,ValuePrint()函数所做的事情做完之后才会结束,而这一个函数层层递归,所以肯定是要先打印最里面的那个ValuePrint()的结果,也就是1,接着是2,然后是3,最后是4,整个过程大致如此......
我们可以看到 递归是递与归的两个过程,递就是不断地调用,而归就是从内到外返回去的过程,用到这个例子中就是 ValuePrint函数不断地调用自己,达到限制条件之后,开始从最里面的ValuePrint返回去,也就是输入1 输入2 输入3 输入4 ,一层一层地向外找到最开始的ValuePrint()。
另外补充一点 每一次函数的调用都会在栈区申请一片空间,如果你递归的次数太多,栈区空间就会不足,这就会导致结果发生异常!!!
感谢阅读!