You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 12:06:01