Python考拉兹序列计算代码嵌套while循环运行异常问题
考拉兹(Collatz)序列计算代码的问题修复
你的代码存在三个核心问题,导致内层循环仅执行一次、外层循环无法正常迭代:
- 缩进错误:外层
while start < 1000000循环的后续逻辑(更新最大序列长度、推进start、重置seq)没有缩进,这些代码只会在第一次内层循环结束后执行一次,外层循环根本不会继续迭代。 - 未重置
num变量:第一次计算完start=13的序列后,num已经变为1,后续外层循环迭代时,num没有被重新赋值为当前的start,内层循环直接跳过。 - 变量
big未初始化:如果初始start的序列长度不是最大的,后续赋值会触发未定义变量错误,需要提前初始化。
修正后的代码
seq = 0 largest = 0 big = 1 # 初始化变量,避免未定义错误 start = 13 while start < 1000000: num = start # 每次外层循环重置num为当前起始数 current_seq = 0 # 用单独变量记录当前序列长度,避免全局变量混乱 while num != 1: if num % 2 == 0: num /= 2 else: num = 3 * num + 1 current_seq += 1 # 可选:打开下方注释打印每一步计算过程 # print(f"{current_seq} {num}") # 更新最长序列记录 if current_seq > largest: largest = current_seq big = start start += 1 print(f"{largest} {big} {largest}")
关键修改说明
- 调整外层循环后续逻辑的缩进,确保每次内层循环结束后都能执行更新操作,同时推进
start的值。 - 每次外层循环开始时将
num重新赋值为当前start,保证每个起始数都能重新计算完整的考拉兹序列。 - 用
current_seq单独记录当前起始数的序列长度,避免全局seq变量的状态混乱,逻辑更清晰。 - 提前初始化
big变量,防止出现未定义错误。
运行修正后的代码,就能正确遍历13到999999的所有数,计算每个数的考拉兹序列长度,并找出最长序列对应的起始数。
内容的提问来源于stack exchange,提问作者Plokiu
相关产品推荐
相关产品推荐

