Python如何生成可互相推导的公式所有合法组合变体?
公式自动推导组合实现方案
第一步:重构公式存储结构
不要仅存储变量列表,需要将每个公式的所有等价变形都拆解为「左值(单个变量)+ 右值(表达式)」的结构化形式,示例如下:
# 基础公式库存储所有原始公式的等价变形 formula_lib = [ # 欧姆定律全变形 {"left": "U", "right": "R * I"}, {"left": "R", "right": "U / I"}, {"left": "I", "right": "U / R"}, # 焦耳定律全变形 {"left": "P", "right": "U * I"}, {"left": "U", "right": "P / I"}, {"left": "I", "right": "P / U"}, ]
第二步:实现公式关联替换逻辑
核心逻辑为遍历所有公式对,只要A公式的右值包含B公式的左值变量,就将A公式对应变量替换为B公式的右值,生成新公式,替换时注意加括号避免运算优先级错误。示例代码如下:
def generate_all_formulas(base_formulas, max_derive_depth=3): all_formulas = base_formulas.copy() for _ in range(max_derive_depth): new_add = [] # 遍历所有公式两两匹配 for target_f in all_formulas: for replace_f in all_formulas: replace_var = replace_f["left"] # 检查待替换变量是否出现在目标公式的右值中 if replace_var in target_f["right"]: # 变量替换,给代入的表达式套括号保证运算逻辑正确 new_right = target_f["right"].replace(replace_var, f"({replace_f['right']})") new_formula = {"left": target_f["left"], "right": new_right} # 去重后加入新公式列表 if new_formula not in all_formulas and new_formula not in new_add: new_add.append(new_formula) if not new_add: # 没有新公式生成时提前终止推导 break all_formulas.extend(new_add) return all_formulas
第三步:适配考试场景筛选可用公式
生成所有推导公式后,输入题目给出的已知变量列表,即可筛选出右值所有变量都属于已知变量的公式,直接代入数值计算即可得到结果。
可选优化方向
- 引入符号计算库
sympy自动完成表达式化简,去掉多余括号、合并同类项,输出更简洁的公式形式 - 给每个变量绑定物理量单位,新增替换后的单位校验逻辑,避免出现逻辑错误的无效公式
内容的提问来源于stack exchange,提问作者idkwhat
相关产品推荐
相关产品推荐

