0

大学で次の課題があります。ここで再帰がどのように機能するのかよくわからないので、再帰について助けが必要です。この "((a+b) (22+3))" のような入力文字列を配列リストに解析します。結果は "(" "(" "a" "+" "b" ")" " " "(" "22" "+" "3" ")" ")" のようになります。これで、各式を解析するはずの関数に次のようになりました。(TreeKnot は 1 つのノードと 2 つのリーフを持つバイナリ ツリーです。関数 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 を返します。あなたに宿題をしてほしくないのですが、誰かが私を正しい方向に導いてくれるかもしれません。私が理解していないもう1つのことは、「return new TreeKnot(null,null,null)」のケースに飛び込まないようにするにはどうすればよいですか?私は、正しい場所にジャンプしないか、いくつか不足していると思いますジャンプします。

前もって感謝します。

4

1 に答える 1