理解递归奇数/偶数函数

时间:2016-08-14 13:31:06

标签: python python-3.x recursion

我目前正在从http://www.sololearn.com/Play/Python学习python,我无法理解为什么这段代码有效。

def is_even(x):
    if x == 0:
        return True

    else:
        return is_odd(x-1)

def is_odd(x):
    return not is_even(x)

print(is_odd(1))

我知道递归对于斐波那契和阶乘是如何起作用的,但是我无法绕过这个。

4 个答案:

答案 0 :(得分:1)

它基于均匀性的归纳定义:

  • 零甚至是
  • 如果某个号码" n"是偶数,那么" n + 1"甚至不是
  • 如果某个号码" n"是不是,然后" n + 1"甚至是

"奇数"显然"甚至没有"。

代码采用此定义,并使用递归向后检查它。

  • 如果我有零,那么它甚至是
  • 如果我有其他号码" n" ,即使" n-1"不是 - 也就是说,如果" n-1"很奇怪。

答案 1 :(得分:1)

is_even'基本案例解析为True。由于is_odd(x)返回not is_even(x),因此值True将成为is_odd返回的表达式的一部分。问题是True否定的次数。通过跟踪调用,您可以看到它将被偶数次否定,因此"保留" x奇数时的真实性[例如:x=3 ==> (not (not (not (not True)))) == True]和奇数次,因此"失去" x是偶数时的真实性[例如:x=2 ==> (not (not (not True))) == False]。可能有一些来自逻辑的术语命名这个多重否定的一般属性。

答案 2 :(得分:0)

递归函数实际上是教授递归的一种不好的方法,只有在它有用时才应用递归。实际上,使用负数测试这些函数会导致RuntimeError: maximum recursion depth exceeded错误。

要检查奇偶校验码,最好使用%运算符或&和运算符,即:

def is_even(x):
    return (x & 1) == 0


def is_odd(x):
    return (x & 1) == 1

那就是说,我认为@Elazar& @DAXaholic的答案应该会给你一些关于那个错误的递归函数的见解,并把它包装好。

答案 3 :(得分:0)

一点提示:

0 -> True
1 -> not True
2 -> not not True
3 -> not not not True
...

等等。