• ベストアンサー

全ての可能な文の生成について2

この下で、「Cでプログラムを書くときに、ある単語Wの後ろにくる可能性のある単語はW[10]の中に格納されてあり、その中のW[0]の後ろにくる可能性のある単語はW[0][10]のなかに格納されてあり、またW[0][0]の後ろにくる可能性のある単語がW[0][0][10]の中に格納されているとき、長さが4以下の可能な全ての文を出力するにはループをどんなふうに回せばいいでしょうか?」と質問して教えていただいたんですけど、後ろにくる可能性のある単語が3回だけではなくて、N-1回続いた場合、単語Wから始まってN個以下の単語からなる文を出力するにはどうすればいいか、もう一回よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yonfa
  • ベストアンサー率52% (22/42)
回答No.2

ANo.1さんの言われるように、単語を保存するためのデータ構造は非常に重要です。 そのデータ構造の設計の仕方によっては、質問者の意図する処理がとても簡単に書けたりします。 今回も質問内容は、「いかにループを回すか」と言うことですので、データ構造についての詳細は省略します。 ループには再帰処理を使うとよいでしょう。 今ある文に単語を一つ追加して出力するという関数を準備して、その関数の中で自分自身を呼び出していくことによって、単語数を伸ばしていくという考えです。 処理のイメージをつかんでいただけたら幸いです。 void main() { // 最初は先頭の単語1つから Comp("", W, 1); } // 次の単語をつなげて出力するための再帰関数 // string, words は仮想のデータ型です void Comp(string sentence, words W, int numwords) { // 現在の文に次の単語をつなげる sprintf(new_sentence, "%s %s\n", sentence, W); printf(new_sentence); // 単語数がN個になっていなければ次の単語をつなげる if (numwords < N){ for (i = 0; i < 10; i++){ Comp(new_sentence, W[i], numwords+1); } } }

yamanashij
質問者

お礼

いつもお世話になっております。 ほんとうに助かりました。 今後もよろしくお願いします。

その他の回答 (1)

回答No.1

データ構造(リンクリスト)の基礎を勉強することをお勧めします。 また、質問を中途半端な説明しかできないのであれば、具体的に何をしたいか書かれることもお勧めしておきます。

yamanashij
質問者

お礼

アドバイスありがとうございます。 これからデータ構造を勉強しようとしますので、ご指導のほうよろしくお願いします。

yamanashij
質問者

補足

質問の書き方が悪くてすみません。 具体的にいうと、「ある単語Wの後ろにくる可能性のある単語は10個(W[10])あって、その10個の単語それぞれの後ろにくる可能性のある単語がまた10個ずつ(W[10][10])あって、またそれらの100個の単語それぞれの後ろにくる可能性のある単語が10個ずつというふうに(n-1)回繰り返されたときに、単語Wから始まってN個以下の単語からなる全ての文を出力するにはループをどのように回せばいいでしょうか」ということです。 よろしくお願いします。

関連するQ&A