递归函数也是一个函数,肯定会根据你结构从头运行到尾,
我一般是这么看递归函数的,
先假设递归的地方总能完成我们指定的任务,然后看这个函数还干了什么其他的事情
然后看有没有能使递归结束的条件,如果有,这个递归就是正确的了
最后如果还是看不出来这个函数的执行顺序,可以假设一个能很快结束的输入值,自己走一遍程序
比如看你写的程序
程序代码:
fun(n)
{
if(n-1)
fun(n-1); //A
printf("sdfsdf");//B
}
fun(n-1);
//这一句先不管,反正假设就是调用了其他一个函数,完成了一些功能
那么这整个函数就是剩下一句printf了,而且这句printf肯定会执行到,那么这个函数的功能就很简单了,就是调用另外一个函数,然后输出一句话
现在看递归结束条件(也叫递归出口),每次递归调用,n-1,所以每次调用,传进来的参数都会比上一次小,而且n小到一定程度的时候,就不会再次递归了,那么可以看出这个递归是正确的.
最后要分析一共输出了几次,那么我就假设n=3,自己在脑子里面执行一遍程序,具体过程我3楼说了.
这样,整个递归就分析完了.
你举的这个例子没什么实际意义,可以看2楼的程序
程序代码:
int factor(int n)
{
if (n==1)
return 1; //即上面的LINE2
else
return factor(n-1)*n; //即上面的LINE1
}
分析如下:
这个函数是计算阶乘的,如果n=1,那结果为1,如果n>1,那结果怎么算呢?
看这一句return factor(n-1)*n;
factor(n-1)我们不用想这个递归到底执行了什么,先假设它总是可以返回给我(n-1)的阶乘,那我现在要算n的阶乘怎么办?直接乘个n上去不就行了嘛,然后就把结果返回给调用的地方.很好理解吧.
然后看结束条件,每次调用的时候,n-1,所以n每次都变小,而n小到一定程度的时候(n==1),就不会再递归了,也就是说,这个递归是有出口的.
分析到这里其实就够了,如果还是不能理解,那也不要紧,还是假设n=3,我们用脑子当CPU来调用一下这个函数看
一开始n=3,if条件不满足,那程序将返回(2的阶乘*3),但是2的阶乘我们不知道,那就算factor(2)
现在n=2,if还是不满足,程序将返回(1的阶乘*2),但是1的阶乘我们还是不知道,那继续算factor(1)
现在n=1,if满足了,直接返回1,也就是1的阶乘等于1
回到n=2这层,1的阶乘等于1我们终于知道了,那2的阶乘=1的阶乘*2=2我们也就知道了
回到n=3这层,2的阶乘等于2我们也知道了,那3的阶乘=2的阶乘*3=6
结果出来了,factor(3)=6,现在整个函数的流程也就都明白了.