-2

下面的代码返回 39,我无法理解逻辑如何工作到它到达 39 的位置。我一直得到 36 或 43。谁能一步一步列出这个程序是如何运行的?

a(1);

function a(foo) {
    if(foo> 20) return foo;
    return b(foo+2);    
}

function b(foo) {
    return c(foo) + 1;
}

function c(foo) {
    return a(foo*2);
}
4

1 回答 1

1

您提到,当您尝试时,您得到了36,所以我猜您只是忘记了必须返回调用堆栈并应用+ 1fromc函数。由于此递归链最终调用c了 3 次,因此您的结果是36 + 3 = 39.

但是,我们可以一步一步来。我在这里所做的一切都列出了每个电话。我们继续往下走,直到其中一个函数给我们一个实际的数字,然后我们往回走,用它返回的数字替换每个调用:

First call:
a(1)  -> 1 < 20 so return b(3)     ^ return 39 --> final result: 39
b(3)  -> return c(3) + 1           │ return 38 + 1 = 39
c(3)  -> return a(6)               │ return 38
a(6)  -> 6 < 20 so return b(8)     │ return 38
b(8)  -> return c(8) + 1           │ return 37 + 1 = 38
c(8)  -> return a(16)              │ return 37
a(16) -> 16 < 20 so return b(18)   │ return 37
b(18) -> return c(18) + 1          │ return 36 + 1 = 37
c(18) -> return a(36)              │ return 36
a(36) -> 36 > 20 so return 36 ─────┘
于 2018-08-22T23:40:44.753 回答