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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:06:04