我想在 C# 中实现一个通用树数据结构,它有一个类Tree<E>
,它引用一个根TreeNode<E>
对象,该对象包含一个子节点的链接列表和相同节点类型的单个父节点。这是一个基本的树形结构,实现这部分我真的没有任何问题。
我想扩展这个树结构来创建Function
,它扩展Tree<double>
,以及它的补充节点类型Expression
,它适当地扩展TreeNode<double>
。我想用这个结构来表示可以用函数的适当变量评估的数学函数。
我目前处于该项目的设计阶段,因此有很多方法可以实现它,但我正在寻找具有适当抽象级别的设计,以涵盖所有类型的功能,同时仍保持其参数签名的密封. 例如,我应该能够Function
在运行时为数学函数创建一个:
f() = 42
, f(x) = x^2
,f(x, y) = x/y + 5
等
如果每个Expression
人都有自己的子项列表(分解以定义给定参数的函数过程的子表达式),那么Expression
应该使用某种评估方法,它接受double
值并吐出它们的标量值(或者如果可能,将其提取到向量级别)。
我对 LINQ 之类的函数式语言不太熟悉,但如果有人是的话,是否有一种简单而强大的方法来实现我计划使用的功能?如果我不必为每种基本操作(比如SinExpression(X)
或AdditionExpression(X,Y)
那些)创建具体的类,而是能够动态定义可能存储在字典中的数学函数,那就太好了,前提是所有变量要么是其他表达式,要么归结为浮点值。那时,如果我需要的话,具体的函数类可以扩展这些抽象的类,只需在基本构造函数中定义评估函数即可。
我还想指出,维护树结构很重要,因为我计划在一个单独的程序中使用这些表达式,该程序将直接更改函数的表达式树(更改节点、删除分支等)。
谁能指出我正确的方向?我将不胜感激。