1

大学1年の初心者プログラマーです。私の家庭教師は、再帰アルゴリズムについていくつかの調査を行い、それを非再帰にするように私たちに依頼しました。いや、いくらやっても無理そうです。質問は次のとおりです

A は文字列 (例: A = "hello") であり、抽象化である exchange は A の k 番目の文字を i 番目の文字と交換します。こんにちは" から "hlelo")。

アイデアは、可能なすべての順列を出力することです.C++のバージョンは読み取ります

void perm(char*a, const int k, const int n)
{
  if(k==n)
  {
    cout << a;
  }
  else
  {
    for (i=k;i<=n;i++)
    {
      interchange(a, k, i);
      perm(a, k+1, n)
    }
  }
 }

私の家庭教師は、ホロウィッツの本「アルゴリズムとデータ構造」にのみ登場する ADL と呼ばれる言語を使用することを非常に好みます。彼は ADL で質問を提起したので、そのコードも追加します。非常に理解しやすいです。

proc perm(IN a, IN k, IN n)
  if k=n then
    print(a)
  else
    {
     for i <- k to n do
       call interchange(a,k,i)
       call perm( a, k+1, n)
     end
    }
end

助けてくれる人に感謝します。マーティン

4

2 に答える 2

2

ここにヒントがあります。宿題をしなくても構いません。文字列をたどって i 番目の文字を見ると、次の 3 つの状態のいずれかになります。

  • 私 == k
  • 私 == n
  • そうしないと

これら 3 つのケースのそれぞれで何を印刷しますか?

于 2013-04-02T19:52:06.310 に答える