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

如何优化判断整数是否属于指定递归数列的Python代码

最优解决方案

首先明确该数列的核心特性:从f(0)开始严格单调递增,所有项均为非负整数,不需要预生成固定长度的序列,也不需要存储所有历史项,按需生成+哈希集合查询即可解决你提到的耗时、硬编码、内存浪费问题。

优化思路

  • 抛弃硬编码的步长生成逻辑,每次仅生成到大于当前待校验值为止
  • 用集合存储已生成的数列项,查询时间复杂度为O(1),远优于原代码列表查询的O(n)
  • 仅保留最新的两个数列项用于生成下一项,不需要额外存储全量历史
  • 提前过滤负数:数列所有项都是非负的,输入负数直接判定不属于数列
  • 消除全局变量,逻辑封装更合理

完整实现代码

def is_all_in_series(input_list):
    # 初始项,集合用于O(1)查询,a、b分别保存f(n-2)、f(n-1)用于生成下一项
    series_set = {0, 1}
    a, b = 0, 1
    
    for num in input_list:
        # 负数直接不匹配
        if num < 0:
            return False
        # 已经生成过的项直接校验
        if num in series_set:
            continue
        # 待校验值大于当前最大项,按需生成直到超过待校验值
        while num > b:
            next_val = 9 * b - 7 * a
            series_set.add(next_val)
            a, b = b, next_val
        # 生成完还是不在集合里,说明不匹配
        if num not in series_set:
            return False
    # 所有项都匹配
    return True

# 输入处理逻辑修正
if __name__ == "__main__":
    length = int(input("Enter the length of input list: "))
    lst = []
    for _ in range(length):
        lst.append(int(input("Enter element: ")))
    result = "found" if is_all_in_series(lst) else "Not Found"
    print(result)

方案优势

  • 内存占用极低:集合仅存实际生成过的数列项,不会预生成冗余项,无多余内存浪费
  • 计算效率高:无多余重复计算,每次生成都是必要操作,集合查询无额外开销
  • 无硬编码逻辑:不管是第100项还是第1000项,都会自动按需生成,不需要修改任何参数
  • 修复了原代码的输入逻辑bug:原代码遍历未初始化的lst又追加元素,完全无法正常获取输入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:42:03