Python中is_even、is_odd这组互相调用的递归函数运行原理是什么?
这段递归奇偶判断代码的运行逻辑
这段是典型的间接递归实现样例,用来判断非负整数的奇偶性,逻辑完全基于两个基础数学规则:
- 0是偶数
- 对任意正整数n,n的奇偶性和n-1相反
两个函数的各自逻辑
is_even(n):判断输入n是不是偶数- 终止条件:如果n等于0,直接返回
True,对应0是偶数的规则 - 递归逻辑:n不等于0时,返回
is_odd(n-1)的结果,意思就是如果n-1是奇数,那n就是偶数
- 终止条件:如果n等于0,直接返回
is_odd(n):判断输入n是不是奇数- 直接返回
not is_even(n),意思就是只要不是偶数的非负整数,就都是奇数
- 直接返回
实际运行示例
我们代入n=3跑一遍is_even(3)的完整流程,你就能看明白:
1. 调用is_even(3):3≠0 → 调用is_odd(2) 2. 调用is_odd(2) → 计算not is_even(2),先调用is_even(2) 3. 调用is_even(2):2≠0 → 调用is_odd(1) 4. 调用is_odd(1) → 计算not is_even(1),先调用is_even(1) 5. 调用is_even(1):1≠0 → 调用is_odd(0) 6. 调用is_odd(0) → 计算not is_even(0),先调用is_even(0) 7. 调用is_even(0):匹配终止条件 → 返回True
现在倒推返回结果:
is_odd(0) = not True → False is_even(1) = 上一步的结果 → False → 1不是偶数,符合预期 is_odd(1) = not False → True → 1是奇数,符合预期 is_even(2) = 上一步的结果 → True → 2是偶数,符合预期 is_odd(2) = not True → False → 2不是奇数,符合预期 is_even(3) = 上一步的结果 → False → 3不是偶数,符合预期
注意事项
这段代码仅作递归教学使用,实际场景不要这么用:
- 只能处理非负整数,输入负数会触发无限递归,最终栈溢出报错
- 递归深度等于输入的数值大小,输入大数时运行效率极低,远不如直接取模
n % 2 == 0判断
内容的提问来源于stack exchange,提问作者Sheng_cai
相关产品推荐
相关产品推荐

