不讲太多大家已经懂的,只讲大家不懂的地方
public class DiGui {
public static void main(String[] args) {
DiGui test = new DiGui();
System.out.println(test.getSum(5));
}
public int getSum(int n) {
if(n==1) { //#1
return 1; //#2
}else {
return n + getSum(n-1);//#3
}
}
}
结果为:15
以上为一个递归代码片段,大家都知道 #3位置 getSum ( 5 - 1)开始,直到返回1结束,迷惑就迷惑在返回1之后程序做了什么对吗?
其实是这样的:
#3 在执行时并未执行完毕,而是等待下一步。
第一步:比如getSum ( 5 - 1) 在等getSum ( 4 - 1) 而 getSum ( 4 - 1) 又在等getSum ( 3 - 1)一直到返回1结束。
第二步:等到 #2位置 返回1后说明满足递归结束条件,这个时候 getSum (n-1) 已经等到最后一个,就是n ==1的时候然后返回一个 1 这会儿需要执行上面第一步还没有执行完毕的程序了,这个时候就开始往回算
getSum(1): return 1 + getSum(1-1) // 这段是结束的 1+0 = 1
从getSum(2)开始我们要注意了。我们不能在关注n-1 这部分了。我们已经在第一步的时候算了,我们要开始执行 "和"
getSum(2):return 2 + getSum(2-1) // 2+1 =3 , 这个2+1的 1 其实是getSum(1)和的1 而不是2-1的1
getSum(3):return 3 + getSum(3-1) // 3 + 3=6到了这步就很明显了。我们只关注getSum(2)的和
getSum(4):return 4 + getSum(4-1) // 4 + 6 =10
getSum(5):return 5 + getSum(5-1)
配合这张图大家看下吧:
到此,我想大家应该都明白是怎么回事了。没有理清的原因就是大家忘记了 "和",一直关注于n-1
懂了的小伙伴麻烦给个赞,谢谢。