n = 10
10+9+8+7+6+5+4+3+2+1 = 55
这是一段代码,用于将从n开始的数字添加到之前的每个数字。
public static int recursion(int index){
if (index == 0){
return 0;
}
else{
return recursion(index-1) + index;
}
}
对不起愚蠢的问题,但这里让我感到困惑:当索引不为零时,它再次调用递归函数,索引减去1,依此类推,直到索引为零。但是,它是编码递归(index-1)+索引。
那么为什么每次调用函数时索引都没有减1并且加10(或任何索引号)?为什么不是这样的:(10 +(9 + 10)+(8 + 10)+(7 + 10)+ ....)?
答案 0 :(得分:3)
尝试将此总和写为
sum(10) = 1+2+3+4+5+6+7+8+9+10
这会让你看到
sum(10) = (1+2+3+4+5+6+7+8+9)+10 = sum(9)+10
和
sum(9) = (1+2+3+4+5+6+7+8)+9
等等
换句话说
sum(i) = sum(i-1) + i;
或者更准确
{0 for i=0
sum(i) = {
{sum(i-1) + i for i>0
BTW每次调用方法时,其变量在每个方法调用中都是单独的实例,这意味着index
中的recursion(10)
与index
中的recursion(9)
是分开的变量。
答案 1 :(得分:2)
手动评估。从index = 10
开始:
索引不为零,所以我们进入else
:
return recursion(10 - 1) + 10
return recursion(9) + 10
现在,recursion(9)
评估为
return recursion(9 - 1) + 9
return recursion(8) + 9
所以,代入以上内容:
return recursion(8) + 9 + 10
所以,继续进行
return recursion(0) + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
我们知道recursion(0)
会返回0
,所以递归会在此时停止。
答案 2 :(得分:0)
recursion(index-1) + index;
对于这个声明,它将是
recursion(10-1) + index;
用于评估10-1
将会完成,即。 9
然后,为了找到该语句的ans,必须找到recursion(9)
,以便再次调用函数recursion
。
所以表达成为
recursion(9) + 10;
递归(9)将是
recursion(9-1) + 9
这会继续,最后会recursion(0)
返回0
。