Python递归统计整除次数的函数返回结果不正确的原因
核心结论
最后一行直接返回n2是完全错误的,这是你当前代码无法得到正确计数结果的核心原因。
逻辑错漏拆解
顺着你写的执行流逐行走,就能看到断层:
- 你最初定义
n2的作用是存储当前n除以divisor的整数商,作为下一层递归的入参。但在if分支里,你把这个n2重新赋值成了递归调用的返回值——这时候n2的含义已经从“待递归的商”变成了“上一层返回的计数”,完全偏离了初始设计。 - 你从来没有把当前层计算的
division_counter和递归拿到的计数值做累加,只是把被篡改过的n2直接往上返回。比如跑你现在的代码计算divisions(100, 2),最终会直接返回0,根本得不到预期的6。
具体执行路径可以更直观体现问题: - 最底层递归走到
divisions(2, 2)时,算出n2 = 1,进入else分支返回当前的division_counter = 0 - 上一层
divisions(4, 2)拿到这个返回的0,直接赋值给n2,走到最后一行返回0 - 所有上层递归都重复这个动作,一路把0传到最外层,没有任何一层把自己累加的那1次计数算进返回值
正确的返回逻辑
if分支执行完成后,应该返回当前层的1次计数,加上后续递归拿到的总次数的和,而不是被篡改过的n2。
另外你原来的else分支也存在计数遗漏:当n2 == 1时,这最后一次整除本身是要计入总次数的,原代码返回0会少算1次。
修正后的可正常运行的代码如下:
def divisions(n, divisor): division_counter = 0 quotient = n // divisor # 补充边界判断:商小于1时直接终止递归,避免无限栈溢出 if quotient >=1 and quotient != 1: division_counter += 1 # 直接返回当前计数 + 递归得到的剩余次数 return division_counter + divisions(quotient, divisor) else: # 商为1时,这最后一次整除计入总次数;商小于1时返回0停止计数 return 1 if quotient ==1 else 0
用这段代码跑divisions(100, 2),最终结果刚好是预期的6。
思路误区说明
你本来想把递归返回的结果存在n2里再统一返回,但这种写法把“给下一层传商”和“接上一层返回的计数”两个完全独立的职责,挤在同一个变量里,最终变量含义混乱,逻辑自然跑不通。递归每层的职责非常清晰:处理自己的那1次计数,把拿到的商传给下一层递归,最后把自己的计数和下一层返回的结果加起来传上去即可,不需要额外用变量中转递归结果。
内容的提问来源于stack exchange,提问作者user15552191
相关产品推荐
相关产品推荐

