可以考虑这样一个函数,返回一个以非叶子节点为运算符,叶子节点为数字(含正负号)的语法抽象树。
tree F(int c, int nOptr) ->
operator = +-*/ 随机生成一个
int a, b;
tree left, right;
a = rand(1,c);
switch operator
b 为算符的右操作数,我们在这个 switch 里根据 operator 反推出 a
// 如果我们满足继续拆分一个数字的条件,就继续拆分这个数字
// 拆分的条件就要依楼主的需求而确定了
// 比如只生成 n 个数字,那么我们可以引入一个参数 int nOptr
// 我们用随机函数将 int nOptr 划分为 nOptr1 和 nOptr2
// 表示以 operator 为根节点的语法树左右两侧可以拥有的算符的数目,如果 nOptr1 或者 nOptr2 为 0 ,那就不拆分对应的数字
// 显然地,一个含有 n 个数字的算式,最多只可能有 n-1 个四则运算符(不是括号)
// 所以对于一个含有 n 个数字,最后运算结果为 c 的算式,我们应该这样调用 F : F(c, n-1)
nOptr1 = rand(1, nOptr)
nOptr2 = nOptr - nOptr1
if nOptr1 > 0
left = f(a, nOptr1)
else
left = new leafNode(a)
if nOptr2 > 0
right = f(b ,nOptr2)
else
right = new leafNode(b)
在生成语法树之后,我们也就可以生成算式了
在执行完这个算法之后,我们就可以通过这个语法树生成一个算式了