三元运算符如何在此递归代码中工作?

时间:2018-09-29 23:05:04

标签: java

在堆栈的最后一次调用中,num等于0,那么为什么代码不返回0?

public static int Add(int num) {
    return(num == 0 ? 0 : num + Add(num - 1));
}

    int num = 7;

1 个答案:

答案 0 :(得分:0)

我相信您的困惑在于,最后一个return语句不会直接将0返回到main()。相反,return语句将返回给函数的调用者。在这种情况下,呼叫者将是自己。这是将1传递到Add()的极其简单的情况的可视化效果:

//num == 1
//Since num != 0, we will return num + Add(num - 1)
//But the compiler doesn't know what Arr(num -1) is
return num + ______; 

在空白处Add(num -1)的结果将到达。当前对Add()的调用被压入堆栈,并且对Add(num -1)的新调用被调用:

public static int Add(int num) {
    return(num == 0 ? 0 : num + Add(num - 1));
}

这里num == 0,因此该方法返回0但不是主要内容。它返回到上一次对Add()的调用,就在理论空白处。所以:

return num + ______;

成为

return num + 0;

由于这是堆栈上的最后一次调用,因此将返回到主程序,并返回1,这对于调用Add(1)的简单情况是正确的