5

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

问题。

当我遵循逻辑时,看起来你给“n”的值并不重要,它最终总是等于“0”并且总是以“false”结束。

到底是怎么回事?

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

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

4 回答 4

4

这就是 isOdd 在偶数上返回 true 的方式:

当您将 2 传递给 isOdd 时,它会将其转发给 isEven。您的调用堆栈现在看起来像这样(最新函数已启动):

isEven(2)
isOdd(2)
main

isEven 现在将使用 1 调用 isOdd:

isOdd(1)
isEven(2)
isOdd(2)
main

isOdd 将再次将此转发给 isEven:

isEven(1)
isOdd(1)
isEven(2)
isOdd(2)
main

整体再次以 0 发生

isEven(0)
isOdd(0)
isEven(1)
isOdd(1)
isEven(2)
isOdd(2)
main

isEven 现在以 true 终止,并且整个调用堆栈被倒回。True 返回到 isOdd:

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

isOdd 将否定返回值,从而返回 false 给 isEven:

isEven(1) <- false
isOdd(1)
isEven(2)
isOdd(2)
main

isEven 再次将结果原样返回给 isOdd

isOdd(1) <- false
isEven(2)
isOdd(2)
main

isOdd 否定并返回:

isEven(2) <- true
isOdd(2)
main

isEven 按原样返回:

isOdd(2) <- true
main

isOdd 取反并返回到 main:

main <- false

这就是 isOdd 在奇数上返回 false 的方式:

当 isEven 终止时,调用堆栈看起来像这样。

isEven(0)
isOdd(0)
isEven(1)
isOdd(1)
main

isOdd 接收真:

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

isOdd 否定:

isEven(1) <- false
isOdd(1)
main

isEven 返回不变的值:

isOdd(1) <- false
main

isOdd 取反并返回到 main:

main <- true

那么解释是什么?

整个技巧是,当你有一个奇数时,调用堆栈中有偶数个否定。当你对一个布尔值求偶数次时,它会像以前一样出现。当你有一个偶数时,你有一个奇数的否定,结果会改变。

于 2013-08-21T20:49:25.177 回答
1

当我遵循逻辑时,看起来你给“n”的值并不重要,它最终总是等于“0”并且总是以“false”结束。

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

isOdd(2) => !isEven(2) => !(isOdd(1)) => !(!isEven(1)) => !(!(isOdd(0))) => !(!(!isEven(0))) => !(!(!(true)))
于 2013-08-21T20:41:47.987 回答
0

该代码对我有用。我在 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>
于 2013-08-21T20:39:53.187 回答
0

递归解决方案有两个要求:基本情况和归纳步骤。在此示例中,基本情况0是偶数。由于它是基本情况,因此所有调用最终都会“削弱”它是预期和正常的。归纳步骤是一个数字是偶数,即使它比奇数大一。但这不是真正的归纳步骤,因为它根据奇数来定义均匀性。所以还需要另外一条规则,如果一个数字不是偶数,它就是奇数。严格证明这个终止有点棘手,但 Phillipp 的堆栈图很好地证明了这一事实。

于 2013-08-22T00:06:02.610 回答