Javascript 这种相互递归逻辑是如何工作的?

Javascript 这种相互递归逻辑是如何工作的?,javascript,recursion,mutual-recursion,Javascript,Recursion,Mutual Recursion,下面的代码返回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); } 您提到当您尝试时,您得到了

下面的代码返回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
函数应用
+1
。由于此递归链最终调用了
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 ─────┘
第一次呼叫:
a(1)->1<20所以返回b(3)^return 39-->最终结果:39
b(3)->返回c(3)+1│ 返回38+1=39
c(3)->返回a(6)│ 返回38
a(6)->6<20所以返回b(8)│ 返回38
b(8)->返回c(8)+1│ 返回37+1=38
c(8)->返回a(16)│ 返回37
a(16)->16<20所以返回b(18)│ 返回37
b(18)->返回c(18)+1│ 返回36+1=37
c(18)->返回a(36)│ 返回36
a(36)->36>20所以返回36─────┘

在这种情况下,使用调试器单步执行程序是一个很好的开始。只需执行一次,就得到了39。也许列出你认为正在发生的步骤,我们可以纠正你?