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

为何我的Collatz序列代码触发“递归深度超出最大值”错误?

Collatz序列递归深度超限问题分析及修复

问题背景

刚学习《Python编程快速上手:让繁琐工作自动化》,编写第四章的Collatz序列代码时出现maximum recursion depth exceeded(递归深度超限)错误,但另一份参考代码可正常运行。需要明确两段代码的差异,同时确认是否可以修改自己的代码使其正常工作,还是必须将while循环放在函数外部。

两段代码对比

我的代码(报错版本)

def collatz(number):
    while number != 1:
        number=collatz(number)
        if number % 2 == 0:
            print ((int(number))//(2),sep='')
            return ((int(number))//(2))
        
        elif number % 2 == 1:
            print (3*int(number)+1,sep='')
            return (3*int(number)+1)
        
print('Enter number:')
number=int(input('>'))
collatz(number)

正确参考代码

def collatz(number):
    if number % 2 ==0: #even number
        print ((int(number))//(2),sep='')
        return ((int(number))//(2))

    elif number % 2 ==1:#odd number
        print (3*int(number)+1,sep='')
        return (3*int(number)+1)

try:
    print('Enter number:')
    number=int(input('>')) #user input
    while number !=1: #performs loop until number becomes 1
        number=collatz(number) #number gets passed to collatz function until it arrives at 1

except ValueError:
    print('Please enter an integer')#error message if non-integer is input

核心差异分析

  1. 循环与递归的逻辑位置

    • 报错代码:将while循环放在collatz函数内部,且在循环第一行就递归调用collatz(number),导致每次函数调用都会开启新的递归层级,快速触发Python默认的递归深度上限(约1000层),引发报错。同时,递归调用后后续的if/elif逻辑根本无法执行,陷入无效递归。
    • 正确代码:collatz函数仅负责单次Collatz计算(输入一个数,返回并打印下一个数),整个序列的循环逻辑放在函数外部的while中,通过迭代调用函数完成序列生成,不会产生递归层级累积。
  2. 函数职责划分

    • 报错代码:函数试图同时承担循环控制和单次计算的职责,逻辑混乱导致递归滥用。
    • 正确代码:函数专注于单次计算,循环控制交给外部代码,职责清晰,逻辑正确。

你的代码修复方案

不需要必须将while循环移到外部,只需修改函数内部逻辑,去掉无效递归,让循环直接处理数值更新即可:

修复后的代码

def collatz(number):
    while number != 1:
        if number % 2 == 0:
            number = number // 2
            print(number)
        elif number % 2 == 1:
            number = 3 * number + 1
            print(number)

print('Enter number:')
number = int(input('>'))
collatz(number)

修复说明

  • 移除了函数内部的递归调用,直接在while循环内计算并更新number的值,避免递归层级累积。
  • 去掉了冗余的int(number)转换(输入和参数均为整数),以及无意义的sep=''参数。
  • 函数内部通过循环完成整个序列的生成,逻辑清晰,不会触发递归深度超限错误。

总结

两种写法都能实现功能:一种是函数负责单次计算,外部循环控制流程;另一种是函数内部包含循环,直接完成整个序列。你的代码只需调整逻辑,移除无效递归即可正常运行,并非必须采用参考代码的结构。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 13:17:36