这种相互递归逻辑是如何工作的?
How does this mutual recursion logic work?
下面的代码 returns 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);
}
你提到当你尝试时,你得到了 36
,所以我猜你只是忘记了你必须返回调用堆栈并从 c
函数。由于此递归链最终调用 c
三次,因此您的结果是 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 ─────┘
下面的代码 returns 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);
}
你提到当你尝试时,你得到了 36
,所以我猜你只是忘记了你必须返回调用堆栈并从 c
函数。由于此递归链最终调用 c
三次,因此您的结果是 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 ─────┘