JavaScript中的递归如何影响函数参数?(河内塔)

JavaScript中的递归如何影响函数参数?(河内塔),javascript,recursion,Javascript,Recursion,我需要有人帮我把事情说清楚 function move(stack, from, to, via) { if (stack === 1) { console.log(`Move ${stack} from ${from} to ${to}`); } else { move(stack-1, from, via, to); console.log(`Move ${stack} from ${from} to ${to}`);

我需要有人帮我把事情说清楚

function move(stack, from, to, via) {
    if (stack === 1) {
        console.log(`Move ${stack} from ${from} to ${to}`);
    } else {
        move(stack-1, from, via, to);
        console.log(`Move ${stack} from ${from} to ${to}`);
        move(stack-1, via, to, from);
    }
}

因此我知道第一个递归
move()
stack==1
之前被调用两次,第三个递归调用
move()
满足
if
语句,并进入第一个
控制台.log

如果
move(3,“A”,“C”,“B”)
第一个
控制台日志将是“move 1 from A to C”

如果
move(4,“A”,“C”,“B”)
第一个
控制台日志将是“move 1 from A to B”


所以我不明白为什么会这样。奇数个递归如何改变参数?因为在这两种情况下,都不会将
move()
使用
via
作为其“目标”点?

注意递归调用会交换参数。@Bergi这就是我想知道的。因为第二个递归调用是如何再次切换的。因为如果第一个递归调用切换到并通过around,那么如果调用同一个递归函数,为什么后续的每个调用都不保留这些参数?如果主函数调用是via=B和to=C,递归调用是via=C和to=B,那么如果我们仍然调用move(),via作为第三个参数,to作为第四个参数,它又是如何变成via=B和to=C的呢?每个递归调用都是独立的,并且有自己的变量。我们不是“还在打电话”,我们是在再次打电话。该调用从当前活动范围中获取变量值。也许能帮上忙?@Bergi哦,我现在明白了。我没有考虑活动范围。非常感谢您花时间解释!