一回も披露したことのない豆知識

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

A 回答 (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);
}
}
}
    • good
    • 0
この回答へのお礼

いつもお世話になっております。

ほんとうに助かりました。

今後もよろしくお願いします。

お礼日時:2006/11/26 22:21

データ構造(リンクリスト)の基礎を勉強することをお勧めします。


また、質問を中途半端な説明しかできないのであれば、具体的に何をしたいか書かれることもお勧めしておきます。

この回答への補足

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

補足日時:2006/11/26 17:11
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

これからデータ構造を勉強しようとしますので、ご指導のほうよろしくお願いします。

お礼日時:2006/11/26 22:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!