为何我的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
核心差异分析
循环与递归的逻辑位置
- 报错代码:将
while循环放在collatz函数内部,且在循环第一行就递归调用collatz(number),导致每次函数调用都会开启新的递归层级,快速触发Python默认的递归深度上限(约1000层),引发报错。同时,递归调用后后续的if/elif逻辑根本无法执行,陷入无效递归。 - 正确代码:
collatz函数仅负责单次Collatz计算(输入一个数,返回并打印下一个数),整个序列的循环逻辑放在函数外部的while中,通过迭代调用函数完成序列生成,不会产生递归层级累积。
- 报错代码:将
函数职责划分
- 报错代码:函数试图同时承担循环控制和单次计算的职责,逻辑混乱导致递归滥用。
- 正确代码:函数专注于单次计算,循环控制交给外部代码,职责清晰,逻辑正确。
你的代码修复方案
不需要必须将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
相关产品推荐
相关产品推荐

