Python中基于递归实现的奇偶判断函数原理疑问
递归实现is_even和is_odd的原理拆解
我完全懂你现在的困惑——看着递归实现的is_even和is_odd能正常运行,但就是摸不透底层逻辑,尤其是is_odd的工作方式,还有非0数值返回结果的原因,对吧?咱们一步步来拆解。
首先先看最常见的递归实现代码(就是你在工作区验证过的那种):
def is_even(x): if x == 0: return True # 终止条件:0是偶数,这是整个递归的"锚点" else: return is_odd(x - 1) # 递推:一个数是偶数 → 它减1之后是奇数 def is_odd(x): return not is_even(x) # 奇数的定义:不是偶数的数
核心逻辑拆解:从终止条件到递归传递
递归的关键是两个点:终止条件和递推关系。这里的终止条件是is_even(0) = True——这是咱们公认的事实,也是整个递归链条的起点,所有计算最终都会落到这个点上。
咱们拿几个具体数值走一遍流程,你就明白为啥非0值会返回对应的True/False了:
例子1:计算is_odd(1)
- 调用
is_odd(1)→ 等价于not is_even(1) - 调用
is_even(1)→ 因为1≠0,所以返回is_odd(0) - 调用
is_odd(0)→ 等价于not is_even(0) - 触发终止条件:
is_even(0)返回True - 现在往回传递结果:
is_odd(0)=not True→Falseis_even(1)=Falseis_odd(1)=not False→True
例子2:计算is_even(2)
- 调用
is_even(2)→ 返回is_odd(1) - 调用
is_odd(1)→ 等价于not is_even(1) - 调用
is_even(1)→ 返回is_odd(0) is_odd(0)=not is_even(0)=not True→False- 往回传递:
is_even(1)=Falseis_odd(1)=not False→Trueis_even(2)=True
解答你的核心疑惑
你可能会想:“如果is_odd(x)只是对is_even(x)取反,那为啥不直接写return not (x%2==0)?” 但递归的思路是用更小的问题解决当前问题:
- 要判断x是不是偶数,就转化为判断x-1是不是奇数;
- 要判断x是不是奇数,就转化为判断x是不是不是偶数;
- 这个转化过程一直持续到x变成0,触发终止条件,然后结果逐层反弹回来。
你之前疑惑的“非0数值为何返回True”,其实是因为当递归到终止条件后,反向传递的结果刚好符合奇偶的定义——比如奇数的递归链条最后会落到not is_even(0)的反向,最终得到True;偶数则会落到is_even(0)的正向,得到True。
另一种等价实现(换个终止条件)
如果把终止条件放在is_odd上,代码会变成这样,逻辑是完全一致的:
def is_odd(x): if x == 0: return False # 终止条件:0不是奇数 else: return is_even(x - 1) # 递推:一个数是奇数 → 它减1之后是偶数 def is_even(x): return not is_odd(x)
本质上还是靠“减1拆解问题+终止条件锚定”的递归逻辑,只是把锚点换了个位置而已。
内容的提问来源于stack exchange,提问作者Khem Myrick
相关产品推荐
相关产品推荐

