如题所述
如果直接用n>1这个条件,由于递归函数多次调用自己,不容易一下子就理解,所以用程序调试的技巧,修改n值,最后再改回n>1,就容易明白了:
第一步:改成n>4,这样递归函数不会调用自己,同时也看出程序不满足if条件时是如何运行的?还可以先明白一些参数的意义,防止搞错。
运行结果:
注意到没有?aa+2指是数组中的第三个元素的地址,同时主函数传过去的参数第三个元素的地址,到了子函数中,就变成了a[]首地址,所以a[0]=3.
第二步:改成n>3,这样递归函数只调用一次自己:
运行结果:
这个结果怎么来的呢?主函数传过去的参数不变:数组中第3个元素的地址 , 4,
返回3+f(a+1,n-1) //这个数就是答案,但是这儿就要调用一次自己了。
然后调用自己f(a+1,n-1):
a+1=4; // a[0]=4 数组中第4个元素的地址
n-1=3;
传递过去的参数变成:数组中第4个元素的地址,3
return a[0] 结束调用自己,这个a[0] =4,所以结果是:3+4=7。
最后一步,把程序改回题中的n>1,这时就要多次调用自己了:
运行结果:
过程和第二步的区别请看:
返回3+f(a+1,n-1) //这个数就是答案,但是这儿就不止一次了,前面的和第二步的一样.
然后第一次调用自己f(a+1,n-1):
a+1=4; //a[0]=4
n-1=3;
传递过去的参数变成:数组中第4个元素的地址,3
这儿开始不同了,本来3+4可以结束,但现在不结束递归,还要继续调用自己。
返回4+f(a+1,n-1)
然后第二次调用自己f(a+1,n-1):
a+1=5; //a[0]=5
n-1=3-1=2;
传递过去的参数变成:数组中第5个元素的地址,2
返回5+f(a+1,n-1)
然后第三次调用自己f(a+1,n-1):
a+1=a[6]=6; //a[0]=6
n-1=2-1=1;
传递过去的参数变成:数组中第6个元素的地址,1
n=1 return a[0] 返回6
然后:
3+4+5+6,不明白请看图:
第一次递归:f(aa+2,4),此时函数f()中,形参a[]={3~10},n=4,触发if(n>1),返回a[0] + f(a+1,n-1),即返回3+f(a+1,3),触发第二次递归;
第二次递归:f(a+1,3),此时函数f()中,形参a[]={4~10},n=3,触发if(n>1),返回a[0] + f(a+1,n-1),即返回4+f(a+1,2),触发第三次递归;
第三次递归:f(a+1,2),此时函数f()中,形参a[]={5~10},n=2,触发if(n>1),返回a[0] + f(a+1,n-1),即返回5+f(a+1,1),触发第四次递归;
第四次递归:f(a+1,1),此时函数f()中,形参a[]={6~10},n=1,触发else,返回a[0] ,即返回6,递归结束。
所以整个递归过程相当于返回了:3+4+5+6=18