我目前正在从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))
我知道递归对于斐波那契和阶乘是如何起作用的,但是我无法绕过这个。
答案 0 :(得分: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
...
等等。