我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。
递归有一个最重要的要求:必须要有结束条件,否则将陷入无穷无尽的调用中。
在我看来,理解递归的最大的难度就是,无法理解它的调用顺序,我们都知道递归的顺序是倒着的,那么为什么呢?
我也是今天才想明白,首先,大家一定不能被使用时不断重复的名字所迷惑,它的本质就是一个函数在调用另一个函数。
比如说有如下代码:
#include<stdio.h>
void fun3()
{
printf("fun\n");
}
void fun2()
{
fun3();
printf("fun2\n");
}
void fun1()
{
fun2();
printf("fun1\n");
}
int main()
{
fun1();
printf("main\n");
}
大家认为这个代码的结果是什么呢?
这个结果是不是和使用递归时的结果似曾相识呢?
所以说大家对于递归的迷惑,主要来自其函数名的误解,它的本质是调用另一个函数,只是名字恰好和现在正在调用的函数名字相同而已。
如果还不理解,再看下面这个递归函数的代码:
#include<stdio.h>
void fun(int i)
{
if(i>10)
return ;
fun(i+1);
printf("%d ",i);
}
int main()
{
fun(0);
printf("\n");
}
这一代码的作用就是将0~10倒着打印,那么递归函数是怎么运行的呢?
我们将0传递给i,然后开始函数:
1、名为fun函数接受传递来的0,然后接着调用一个名为fun的函数,并将i+1即1传递过去。注此函数未执行结束,还有一句打印未执行
2、名为fun的函数接受传递来的1,然后接着调用一个名为fun的函数,并将i+1即2传递过去。注此函数未执行结束,还有一句打印未执行
……
11、名为fun的函数接受传递来的10,然后接着调用一个名为fun的函数,并将i+1即2传递过去。注此函数未执行结束,还有一句打印未执行
12、名为fun的函数接受传递来的11,i>10,执行return语句,此函数结束
那么,此函数结束了,原来的函数执行结束了吗?
显然是没有的,这时候会回到第11次,将未执行的语句执行,然后结束,即打印i的值,此时传递过来的i的值为10
接着回到第10次,打印9……
最后一直到第一次,打印0,函数调用结束,回到主函数,结束整个程序
因此在使用递归时,一定要主要函数的调用到底结束了吗,没有结束,那就仍然需要考虑,结束了就可以扔掉不管了