我有以下大学作业。我需要递归方面的帮助,因为我不太明白递归在这里是如何工作的。我将类似于“((a+b) (22+3))”的输入字符串解析为一个数组列表。结果看起来像 "(" "(" "a" "+" "b" ")" " ""(" "22" "+" "3" ")" ")"。现在我有以下函数,它们应该解析每个表达式。(TreeKnot 是一棵有一个节点和两个叶子的二叉树,函数 nextSymbol() 只是将 currentSymbol 设置为数组列表中的下一个符号) - 注意这些函数还没有完成,因为最简单的事情是行不通的.
TreeKnot left = term();
if(currentSymbol.equals("+")){
nextSymbol();
TreeKnot right = term();
return new TreeKnot(left, right, "+");
} else if(currentSymbol.equals("*")){
nextSymbol();
TreeKnot right = term();
return new TreeKnot(left, right, "*");
} else {
return left;
}
}
在下一个函数中,我尝试递归地解析术语,以便如果打开新括号,我会再次解析表达式。
private TreeKnot term(){
if(currentSymbol.contains("(")){
nextSymbol();
ausdr();
}else if(currentSymbol.matches("(\\d)|([a-zA-Z])")){
nextSymbol();
return new Terminal(null,null,leftOver.get(symbi-1));
}else if(currentSymbol.contains(")")){
nextSymbol();
ausdr();
}
return new TreeKnot(null,null,null);
}
使用上面提到的表达式解析 a+3 工作正常,但随后他再次跳入 ausdr() 并返回 null,而不是向前跳一步。我不想让你做我的功课,但也许有人可以引导我走向正确的方向。我不明白的另一件事是,我如何防止它跳入“return new TreeKnot(null,null,null)”的情况?我想,我没有在正确的地方跳下去,或者我错过了一些跳跃。
提前致谢。