判断数值是否为指定底数幂的递归函数实现是否正确?
判断给定数值是否为指定底数幂的递归函数正确性判定
你给出的实现代码如下:
def sum_factor(num,base): while num>=base: if num==base: return "Yes" num=num/base sum_factor(num/base,base) return "Nope" print(sum_factor(12,2))
结论
这个实现存在多处严重错误,完全无法实现预期功能,运行测试用例sum_factor(12,2)时会直接触发死循环,根本不会返回任何结果。
具体错误点
- 死循环问题:
while num>=base的循环体内没有任何修改num值的逻辑,只要传入的num大于base且不等于base,就会永远卡在循环判断里,永远走不到循环外的除法、递归逻辑。比如测试用例里12大于2,且不等于2,循环会无限判断12>=2、12==2?否,直接卡死。 - 递归返回值丢失:就算修复了死循环问题,代码里调用
sum_factor(num/base,base)时没有接收、返回递归调用的结果,无论深层递归判断出是幂返回了"Yes",外层函数都会忽略这个结果,最终直接走到return "Nope"的逻辑,判断完全失效。 - 除法精度隐患:代码中用
/做除法在Python3中会生成浮点数,连续多次浮点运算很容易出现精度误差,比如本该整除的数值计算后出现微小的小数尾差,会导致相等判断出错。判断整数幂场景应该先校验取模结果,再用整数整除做数值缩放。 - 边界场景缺失:代码完全没有处理边界情况:比如任意非0底数的0次幂为1的场景、底数为0/1/负数的非法输入场景,传入这类参数时要么判断错误要么直接死循环。
修正后的参考实现
def is_power(num, base): # 非法输入拦截:仅考虑正整数幂场景,底数需大于1,数值需为正整数 if base <= 1 or num <= 0: return "Nope" # 如需支持0次幂判断(任意底数的0次幂为1),放开下方注释即可 # if num == 1: # return "Yes" # 终止条件:数值等于底数,匹配幂的结果 if num == base: return "Yes" # 无法整除说明不可能是对应底数的幂 if num % base != 0: return "Nope" # 必须return递归调用的结果,不能丢弃返回值 return is_power(num // base, base) print(is_power(12, 2)) # 输出 Nope,12不是2的整数次幂 print(is_power(8, 2)) # 输出 Yes,8=2^3
内容的提问来源于stack exchange,提问作者andro_meda
相关产品推荐
相关产品推荐

