0

我有以下大学作业。我需要递归方面的帮助,因为我不太明白递归在这里是如何工作的。我将类似于“((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)”的情况?我想,我没有在正确的地方跳下去,或者我错过了一些跳跃。

提前致谢。

4

1 回答 1

0

这不是有问题的代码吗

 }else if(currentSymbol.contains(")")){
        nextSymbol();
        ausdr();
    }

如果你已经完成了一个学期,你想返回那个学期。我不确定这些字段是什么,TreeKnot但看起来你想在这里创建一个。

于 2013-06-17T11:21:40.843 回答