代码评审:判断2的幂时引入无限循环的写法是否可接受
问题答复
首先明确:你的代码里的无限循环完全是逻辑bug,不属于任何有意引入无限循环的合理编码实践,这类写法在代码评审中属于严重问题,必须修复,绝对不可接受。
死循环触发原因
问题根源出在两个设计疏漏上:
- 使用了Python的真除法
/,运算结果会转为浮点数,给逻辑引入了浮点数精度风险 - 循环条件设计错误,且没有做输入边界校验
- 对负整数输入(比如
n=-2),Python的取模运算结果和除数同号,当n被除到(-1, 0)区间的负小数时,n % 2的结果永远是正的余数,永远不等于负数n本身,循环会一直执行下去 - 当传入数值大到浮点数无法精确表示时,反复除以2的过程中可能出现精度丢失,永远达不到循环退出条件
- 如果你额外加了
while n <10:这类逻辑,相当于又叠了一层永远为真的循环条件,自然会卡死
- 对负整数输入(比如
你现在的代码能过给定测试用例纯属巧合:测试用例只覆盖了0、1、8、9这几个非负小整数,刚好没踩中死循环的触发场景。
正确实现参考
判断2的幂不需要绕弯,两种常见正确写法:
- 整数循环写法(和常规伪代码逻辑一致)
def is_power_of_two(n): if n <= 0: return False while n % 2 == 0: n = n // 2 # 用整数除法,避免浮点数问题 return n == 1
- 位运算写法(时间复杂度O(1),性能最优)
def is_power_of_two(n): return n > 0 and (n & (n - 1)) == 0
原理是所有2的幂的二进制表示都只有1位是1,n-1会把这一位变成0,后面所有位变成1,做按位与运算结果刚好为0。
内容的提问来源于stack exchange,提问作者icecream
相关产品推荐
相关产品推荐

