Javascript 相互递归函数-练习对我来说没有意义

Javascript 相互递归函数-练习对我来说没有意义,javascript,Javascript,我知道这是一个愚蠢的方法来确定奇偶数。这只是一堂递归的课,可能还有其他一些概念 这个问题 当我遵循逻辑时,看起来不管你给“n”什么值,它最终总是等于“0”,最后总是“false” 发生了什么事 function isOdd(x) { return !isEven(x); } function isEven(x) { if(x===0) { return true; } else { return isOdd(x-1); }

我知道这是一个愚蠢的方法来确定奇偶数。这只是一堂递归的课,可能还有其他一些概念

这个问题

当我遵循逻辑时,看起来不管你给“n”什么值,它最终总是等于“0”,最后总是“false”

发生了什么事

function isOdd(x) {
    return !isEven(x);    
}

function isEven(x) {
    if(x===0) {
        return true;
    } else {
        return isOdd(x-1);
    }
}

代码对我有用。我在Firefox和IE上试过了

<html>
<head>
<script language="javascript">
function isOdd(x) {
    return !isEven(x);    
}

function isEven(x) {
    if(x===0) {
        return true;
    } else {
        return isOdd(x-1);
    }
}

alert(isOdd(6));

</script>

</head>
<body>

</body>
</html>

函数isOdd(x){
返回!isEven(x);
}
函数isEven(x){
如果(x==0){
返回true;
}否则{
返回isOdd(x-1);
}
}
警报(isOdd(6));
当我遵循逻辑时,看起来什么值都不重要 如果你给“n”,它最终总是等于“0”,并且总是以 “假”

您需要记住堆栈跟踪中有多少isOdd。例如:给定x=2

isOdd(2) => !isEven(2) => !(isOdd(1)) => !(!isEven(1)) => !(!(isOdd(0))) => !(!(!isEven(0))) => !(!(!(true)))
这就是isOdd在偶数上返回true的方式: 当您将2传递给isOdd时,它会将此转发给isEven。您的调用堆栈现在如下所示(最新的函数已启动):

isEven现在将使用1调用isOdd:

isOdd(1)
isEven(2)
isOdd(2)
main
isOdd将再次将此转发给isEven:

isEven(1)
isOdd(1)
isEven(2)
isOdd(2)
main
isEven(1) <- false
isOdd(1)
isEven(2)
isOdd(2)
main
整个过程在0时再次发生

isEven(0)
isOdd(0)
isEven(1)
isOdd(1)
isEven(2)
isOdd(2)
main
isEven现在以true终止,整个调用堆栈被倒带。返回给isOdd的值为True:

isOdd(0)   <-true
isEven(1)
isOdd(1)
isEven(2)
isOdd(2)
main
isOdd接收到true:

isOdd(0) <-true
isEven(1)
isOdd(1)
main

isOdd(0)递归解有两个要求:基本情况和归纳步骤。在本例中,基本情况是
0
为偶数。由于这是基本情况,所有调用最终都会“切下”到它,这是正常的。归纳步骤是,一个数是偶数,即使它比奇数大一个。但这不是一个真正的归纳步骤,因为它用奇异性来定义均匀性。所以需要另一条规则,如果一个数字不是偶数,它就是奇数。严格地证明它是终止的有点棘手,但Phillip的堆栈图很好地证明了这一点。

您的代码按原样工作:它适合我。你遇到了什么问题?对我来说很有用:如果你把大量的数据放在其中,一些浏览器可能会在深层递归上崩溃,但看不出有任何其他原因这不起作用。值得注意的是,这是尾部递归的一个例子,但不幸的是,没有Javscript引擎(目前)对其进行优化。代码正在工作。现在唯一的问题是,无论是偶数还是奇数,x似乎总是被降到0。还在努力解决这个问题。谢谢!我只是想把这些都画出来,但可能不会画得那么好。当堆栈冒泡时,我没有意识到真值和假值之间有一个触发器。
isOdd(1) <- false
isEven(2)
isOdd(2)
main
isEven(2) <- true
isOdd(2)
main
isOdd(2) <- true
main
main <- false
isEven(0)
isOdd(0)
isEven(1)
isOdd(1)
main
isOdd(0) <-true
isEven(1)
isOdd(1)
main
isEven(1) <- false
isOdd(1)
main
isOdd(1) <- false
main
main <- true