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

如何用Python实现完整序列类型识别函数?已支持linear与quadratic

序列类型识别与公式推导完善方案

核心疑问解答

不是只能识别序列类型,完全可以推导对应序列的数学公式。只要根据不同序列的数学特征,通过差分、比值分析或解方程的方式,就能计算出公式的系数。

现有代码的问题

  1. 仅部分实现线性、二次识别,逻辑不够直观(用反向遍历+条件判断,不如直接计算差分)
  2. 未实现指数、三次序列的识别逻辑
  3. 只返回类型,未推导公式
  4. 序列长度判断要求5个以上,其实线性只需要3个点、二次4个、三次5个、指数3个,可灵活调整

完善后的实现思路

1. 序列类型识别逻辑

基于数学特征直接判断:

  • 线性序列:一阶差分(相邻项的差)全部相等
  • 二次序列:二阶差分(一阶差分的差)全部相等(且一阶差分不恒定)
  • 三次序列:三阶差分(二阶差分的差)全部相等(且二阶差分不恒定)
  • 指数序列:相邻项的比值全部相等(序列无零项,且比值不为1,避免和线性混淆)

2. 公式推导方法

  • 线性公式:y = a*x + b,其中a是一阶差分,b = y[0](假设x从0开始)
  • 二次公式:y = a*x² + b*x + c,a = 二阶差分 / 2,再代入前两个点解出b和c
  • 三次公式:y = a*x³ + b*x² + c*x + d,a = 三阶差分 / 6,逐步推导b、c、d
  • 指数公式:y = a*b^x,b = y[1]/y[0],a = y[0]

3. 完整代码实现

def analyse_sequence(y: list[int]):
    # 辅助函数:计算n阶差分
    def get_differences(arr, n):
        diffs = arr.copy()
        for _ in range(n):
            diffs = [diffs[i+1] - diffs[i] for i in range(len(diffs)-1)]
        return diffs
    
    # 辅助函数:检查所有元素是否相等
    def all_equal(arr):
        return all(x == arr[0] for x in arr)
    
    seq_len = len(y)
    result = {"type": None, "formula": None}
    
    # 线性序列判断(至少3个点)
    if seq_len >= 3:
        first_diffs = get_differences(y, 1)
        if all_equal(first_diffs):
            a = first_diffs[0]
            b = y[0]
            result["type"] = "linear"
            result["formula"] = f"y = {a}x + {b}"
            return result
    
    # 二次序列判断(至少4个点)
    if seq_len >= 4:
        second_diffs = get_differences(y, 2)
        if all_equal(second_diffs) and not all_equal(get_differences(y, 1)):
            a = second_diffs[0] / 2
            b = get_differences(y, 1)[0] - a
            c = y[0]
            result["type"] = "quadratic"
            result["formula"] = f"y = {a}x² + {b}x + {c}"
            return result
    
    # 三次序列判断(至少5个点)
    if seq_len >= 5:
        third_diffs = get_differences(y, 3)
        if all_equal(third_diffs) and not all_equal(get_differences(y, 2)):
            a = third_diffs[0] / 6
            # 推导二阶差分对应的系数
            second_diff_base = get_differences(y, 2)[0] - 6*a
            b = second_diff_base / 2
            first_diff_base = get_differences(y, 1)[0] - 3*a - 2*b
            c = first_diff_base
            d = y[0]
            result["type"] = "cubic"
            result["formula"] = f"y = {a}x³ + {b}x² + {c}x + {d}"
            return result
    
    # 指数序列判断(至少3个点,无零项)
    if seq_len >= 3 and all(num != 0 for num in y):
        ratios = [y[i+1]/y[i] for i in range(seq_len-1)]
        if all_equal(ratios) and ratios[0] != 1:
            b = ratios[0]
            a = y[0]
            result["type"] = "exponential"
            result["formula"] = f"y = {a} * ({b})^x"
            return result
    
    # 无法识别的情况
    if seq_len < 3:
        return f"需要至少3个序列值才能进行判断"
    return "无法识别该序列类型"

# 测试示例
print(analyse_sequence([2,4,6,8,10]))  # 线性
print(analyse_sequence([1,3,6,10,15])) # 二次
print(analyse_sequence([1,4,10,20,35]))# 三次
print(analyse_sequence([2,6,18,54]))   # 指数

代码说明

  1. get_differences函数:用于计算n阶差分,比如一阶差分是相邻项的差,二阶差分是一阶差分的差,以此类推
  2. all_equal函数:检查数组内所有元素是否相等,用于判断差分/比值是否恒定
  3. 按从简单到复杂的顺序判断(线性→二次→三次→指数),避免误判
  4. 每种类型识别后直接推导公式并返回,无需遍历所有可能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:55:19