SymPy表达式树后序遍历遗漏顶层操作的修复方法咨询
解决SymPy表达式后序遍历遗漏顶层操作的问题
你的问题核心是后序遍历逻辑错误:原代码只递归处理了表达式的子节点(expr.args),但没有处理当前表达式本身(比如顶层的Add操作)。后序遍历的正确顺序是:先递归遍历所有子节点,再处理当前节点。
修正后的代码
import sympy def post(expr): # 先递归处理所有子节点 for arg in expr.args: post(arg) # 处理当前节点(后序遍历关键:子节点处理完再处理自身) print(f'current expr: {expr}') print(f'expr.func: {expr.func}') print(f'expr.args: {expr.args}') print('---') x, y, z = sympy.symbols('x,y,z') expr = sympy.sin(x * y) + z**2 post(expr)
运行结果说明
执行后会按后序顺序输出所有节点:先最底层的原子节点(x、y、z),再是它们的父节点(x*y、sin(x*y)、z**2),最后是顶层的Add节点,完整覆盖所有操作:
current expr: x expr.func: x expr.args: () --- current expr: y expr.func: y expr.args: () --- current expr: x*y expr.func: <class 'sympy.core.mul.Mul'> expr.args: (x, y) --- current expr: sin(x*y) expr.func: <class 'sympy.core.function.sin'> expr.args: (x*y,) --- current expr: z expr.func: z expr.args: () --- current expr: z**2 expr.func: <class 'sympy.core.power.Pow'> expr.args: (z, 2) --- current expr: sin(x*y) + z**2 expr.func: <class 'sympy.core.add.Add'> expr.args: (sin(x*y), z**2) ---
错误原因解析
- 第一个版本代码:仅在循环里打印子节点信息,完全未处理当前表达式(顶层
Add),因此遗漏了顶层操作。 - 第二个版本直接遍历
expr:SymPy的表达式对象(如Add)不是可迭代对象,必须通过.args属性访问子节点,因此抛出TypeError。
内容的提问来源于stack exchange,提问作者user20693776
相关产品推荐
相关产品推荐

