私はこの方法があります:方法から削除末尾再帰(Java)の
private String computePerm(int iteration) {
if (iteration < n + 1) {
return Character.toString((char) (iteration + 48));
} else {
if (iteration % n == 0) {
return computePerm((iteration/n) - 1) + computePerm(((iteration - 1) % n + 1));
} else {
return computePerm(iteration/n) + computePerm(iteration % n);
}
}
}
それは、単一の幅優先探索トラバーサルにより誘発される順列を計算します。私はPost's correspondence problemを解決するためにそれを使用しています。しかし、私はそれが末尾再帰であると思われ、問題のいくつかのインスタンスでは醜いオーバーヘッドが発生するようです。
メソッドの動作を維持しながらテール再帰を削除するにはどうすればよいですか?
あなたの方法で4つの再帰呼び出しがあります。それは尾の再帰ではありません。 – shmosel
@shmosel次に、最初に再帰を削除するにはどうすればよいですか?私は正直言ってそれをやっているようには見えません。なぜなら、それはかなり早いと思われるからです。 –
あなたは誰ができると言いましたか?そして、なぜあなたはそれがより速くなると確信していますか? – shmosel