这就是 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
那么解释是什么?
整个技巧是,当你有一个奇数时,调用堆栈中有偶数个否定。当你对一个布尔值求偶数次时,它会像以前一样出现。当你有一个偶数时,你有一个奇数的否定,结果会改变。