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

如何用Python解决生成指定阶数多项式项的组合问题

可变长度变量的指定阶数多项式项生成方案

这个问题本质是求解不定方程 e1 + e2 + ... + en = order 的所有非负整数解,其中n是变量列表长度,每个解对应一个多项式项的指数组合,将指数组合格式化后即可得到最终结果。

实现1:递归实现(无第三方依赖)

递归思路:

  • 每一步处理一个变量,给它分配0到剩余可用阶数的指数
  • 剩余阶数减去当前分配的指数后,交给下一个变量处理
  • 所有变量处理完成时,若剩余阶数刚好为0,就将当前指数组合转换为多项式项加入结果集
def generate_poly_terms(variables: list[str], order: int) -> list[str]:
    var_count = len(variables)
    result = []

    def backtrack(current_var_idx: int, left_order: int, exponent_list: list[int]):
        # 所有变量处理完成
        if current_var_idx == var_count:
            if left_order == 0:
                # 指数组合转多项式项
                term_parts = []
                for var, exp in zip(variables, exponent_list):
                    if exp == 0:
                        continue
                    term_parts.append(var if exp == 1 else f"{var}^{exp}")
                result.append("*".join(term_parts))
            return
        # 当前变量可分配0到剩余阶数的指数
        # 若要匹配示例输出顺序,把range(left_order + 1)改为range(left_order, -1, -1)即可
        for e in range(left_order + 1):
            backtrack(current_var_idx + 1, left_order - e, exponent_list + [e])
    
    backtrack(0, order, [])
    return result

测试用例:

print(generate_poly_terms(["x1", "x2", "x3"], 2))
# 调整遍历顺序后输出:['x1^2', 'x1*x2', 'x1*x3', 'x2^2', 'x2*x3', 'x3^2']
print(generate_poly_terms(["x1", "x2"], 3))
# 调整遍历顺序后输出:['x1^3', 'x1^2*x2', 'x1*x2^2', 'x2^3']

实现2:基于星棒法的标准库实现(更简洁)

基于组合数学的「星与棒」定理,直接用Python标准库itertools.combinations生成所有指数组合,不需要手写递归逻辑:

from itertools import combinations

def generate_poly_terms(variables: list[str], order: int) -> list[str]:
    var_count = len(variables)
    result = []
    # 星棒法:在order个星之间插入var_count-1个隔板,拆分得到所有指数组合
    for split_points in combinations(range(order + var_count - 1), var_count - 1):
        exponent_list = []
        prev_point = -1
        for p in split_points:
            exponent_list.append(p - prev_point - 1)
            prev_point = p
        exponent_list.append(order + var_count - 1 - prev_point - 1)
        # 指数组合转多项式项
        term_parts = []
        for var, exp in zip(variables, exponent_list):
            if exp == 0:
                continue
            term_parts.append(var if exp == 1 else f"{var}^{exp}")
        result.append("*".join(term_parts))
    return result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:06:01