为啥选D?谁给个解释

sweetswing 2019-04-04 03:32:47
#include <stdio.h>

int sum(int* array, int len)

{

if (len==0)

return array[0];

else

return array[0]+sum(array+1,len-1);

}

main()

{

int array[5]={1,2,3,4,5};

int res=sum(array,4);

printf("%d\n",res);

}

程序输出结果是()

正确答案: D

你的答案: B
A.1
B.8
C.10
D.15
...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
六道佩恩 2019-04-04
  • 打赏
  • 举报
回复
sum是个递归函数,这时你需要理解这个递归函数的功能是什么,最重要的一句是“return array[0]+sum(array+1,len-1);”,假如len为1,这条语句就相当于array[0]+array[1],因为再次调用的时候传的长度为0,返回array[0],但这个array的值对于外面一层来说是array+1,所以传回来的是(array+1)[0],其实就是array[1]。 同样的,当len为2可以发现这句的结果是array[0]+array[1]+array[2],所以我们可以得出结论:函数sum的功能是求出数组array[0]+···+arr[len]的和。 再看main,调用语句是sum(array,4),那么就是求array[0]+···+array[4]的和,你加起来就是15了。 如果你实在不理解,可以把自己当成计算机来一步一步运算一遍,反正也没几层递归。
jiht594 2019-04-04
  • 打赏
  • 举报
回复
array[0]+sum(array+1,3); : sum(array+1,3) = array[0]' + sum(array+1,2);
=>array[0]+ array[1] + sum(array+1,2);
array[0]+ array[1] + array[2] + sum(array+1,1);
array[0]+ array[1] + array[2] + array[3] + array[4]
自信男孩 2019-04-04
  • 打赏
  • 举报
回复
递归,最后是5+4+3+2+1=15,注意return array[0] + sum(array+1, len-1)并不是所有的array[0]都是指1,因为需要注意下array+1实参,即只有第一次递归的的array[0]是1,第二次是(array+1)[0]即2,第三次递归实在第二次的基础上又加了1,即是3等等,知道len=0,此时array[0]即5,所以再根据递归的返回,所以最后一次是5, 倒数第二次是4,依次3, 2, 1;所以是5+4+3+2+1

之所以是5+4...+1而不是1+2+...+5,因为函数栈是先进后出,最先确定是array[0]是5.
636f6c696e 2019-04-04
  • 打赏
  • 举报
回复
递归1+2+3+4+5=15,不太懂你选B的逻辑。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧