大学で次の課題があります。ここで再帰がどのように機能するのかよくわからないので、再帰について助けが必要です。この "((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)」のケースに飛び込まないようにするにはどうすればよいですか?私は、正しい場所にジャンプしないか、いくつか不足していると思いますジャンプします。
前もって感謝します。