求大佬解释这个递归函数运行到最后一步不满足if条件时为是如何运行的 答案是18为什么会是4个数相加

如题所述

如果直接用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,不明白请看图:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-10-18

第一次递归: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

本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网