2016-11-23 6 views
1

私はこの方法があります:方法から削除末尾再帰(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を解決するためにそれを使用しています。しかし、私はそれが末尾再帰であると思われ、問題のいくつかのインスタンスでは醜いオーバーヘッドが発生するようです。

メソッドの動作を維持しながらテール再帰を削除するにはどうすればよいですか?

+0

あなたの方法で4つの再帰呼び出しがあります。それは尾の再帰ではありません。 – shmosel

+0

@shmosel次に、最初に再帰を削除するにはどうすればよいですか?私は正直言ってそれをやっているようには見えません。なぜなら、それはかなり早いと思われるからです。 –

+0

あなたは誰ができると言いましたか?そして、なぜあなたはそれがより速くなると確信していますか? – shmosel

答えて

-1

これは、あなたが(サイズNのアルファベットの順列)後にしているものを行います。

private static String computePerm(int iteration) { 
    return Integer.toString(iteration, n); 
} 
+0

私はそれがまったく探しているとは思わない。ごめんなさい。 –

+0

'computePerm()'はアルファベットの置換を生成します。これはサイズが_n_の右ですか?私はあなたのソリューションをテストするためにトークンのペアを生成するためにそれを使用していると仮定します。 'Integer.toString(i、radix)'はあなたのメソッドと同じことをします。あなたの問題に対する反復的な解決策の例が必要な場合は、その情報源を調べるか、テストデータを設定するために必要な場合にのみ呼び出しを使用してください。 – teppic

関連する問題