Python Collatz序列问题:查找≤起始数且序列长度更长的数值
问题需求
给定起始正整数x,找出所有小于等于x的正整数中,Collatz序列长度大于x本身Collatz序列长度的数值;存在多个符合条件的数值时,返回序列长度最大的那个。
示例:当起始数为4时:
4的Collatz序列:4→2→1,长度为3
3的Collatz序列:3→10→5→16→8→4→2→1,长度为8
2的Collatz序列:2→1,长度为2
1的Collatz序列:1,长度为1
最终符合要求的返回结果为3
原有代码错误点排查
- 全局变量未在循环内重置:
sequence、length_of_sequence定义在for循环外部,计算完第一个数值的序列后没有清空重置,后续计算的长度会叠加之前的结果,统计值完全错误。 - 序列元素添加逻辑错误:
sequence.append(1)写在while循环内部,每次迭代计算完下一个数值都会新增一次1,导致1被重复添加多次,序列长度统计失真。 - 字典键值对应错误:while循环结束时i的值已经被修改为1,
d.update({i: length_of_sequence})相当于所有计算结果都存到键1上,没有和原起始数对应。 - 缺少需求要求的过滤逻辑:没有先计算x本身的Collatz序列长度,也没有过滤掉序列长度小于等于x序列长度的数值,不符合需求规则。
修正后可用代码
def solution(x): # 工具函数:计算指定数值的Collatz序列长度 def get_collatz_len(n): length = 0 current = n while current != 1: length += 1 if current % 2 == 0: current = current // 2 else: current = 3 * current + 1 # 补充计数终点1的长度 length += 1 return length # 先计算基准值x的序列长度 x_base_len = get_collatz_len(x) valid_map = {} # 遍历所有小于等于x的正整数 for num in range(1, x + 1): current_len = get_collatz_len(num) if current_len > x_base_len: valid_map[num] = current_len # 无符合条件的值返回None,有则返回长度最大的对应数值 return max(valid_map, key=valid_map.get) if valid_map else None
- 测试验证:传入参数4调用
solution(4),返回结果为3,和示例一致。
内容的提问来源于stack exchange,提问作者penutbutterjellytime
相关产品推荐
相关产品推荐

