• ベストアンサー

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

charmer29-2の回答

回答No.1

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

yamanashij
質問者

お礼

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

yamanashij
質問者

補足

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

関連するQ&A

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

    Cでプログラムを書くときに、ある単語Wの後ろにくる可能性のある単語はW[10]の中に格納されてあり、その中のW[0]の後ろにくる可能性のある単語はW[0][10]のなかに格納されてあり、またW[0][0]の後ろにくる可能性のある単語がW[0][0][10]の中に格納されているとき、長さが4以下の可能な全ての文を出力するにはループをどんなふうに回せばいいでしょうか?

  • 簡単なfor文

    #include <stdio.h> int main(void) { int n; int i; for(n=0 ;n<10;n++){ for(i=0; i<=n ;i++){ printf("*"); } printf("\n"); } return(0); } こういったプログラムを実行すると、以下のように表示されるのですがなんででしょうか? * ** *** 以下略 自分の考えですと、*は毎回一つしか表示されずに改行されると思うのですが・・・ * * * * 以下略 i個分の*を表示するなどという指示をプログラムはなされていないと思うのですがなぜなんでしょうか? 一つ目のfor文では10回ループが繰り返され改行 二つ目のfor文で*を永遠に表示 といった僕の解釈ではおかしいですよね。 当方C言語初心者で、周りに聞く人がいないため教えていただけると非常に助かりますm(__)m

  • 乱数生成について

    c言語のプログラムで、1と-1をランダムにn個出力するプログラムを書きたいと思っています。どのようにすればいいでしょうか。

  • 順列生成アルゴリズムについて仕組みを教えてください

    ある本を参考に順列を出力するプログラムをJavaScript用に書き直しました。 上手く動いたのですが、どうして、順列を出力できるのか理解できません。 まず、プログラムは以下になります。 <script> // 対象の配列 var array = [0,1,2,3]; // 配列の数 var N = array.length; // 順列を出力するプ関数 function permutation( n ) { // テンポラリー用 var temp; // 順列を生成する処理部分 if ( n < N ) { for ( var i = n; i < N; i++ ) { // (1)対象の配列から数字を一つ取り出して、他の数字と入れかえる temp = array[n]; array[n] = array[i]; array[i] = temp; // (2)再起呼び出し permutation( n + 1 ); // (3)入れ替えた数字を元に戻す temp = array[n]; array[n] = array[i]; array[i] = temp; } } else { // 出力 console.log( "結果:" + array); } } // エントリーポイント permutation(0); </script> 処理を理解するために、コメントの(1)や(3)などに console.log を入れて、出力したところ、全く理解できないスタックの流れになっていました。 具体的には、1~2を条件を満たす間繰り返した後、一度出力(スタック開放)します。その後、(3)の処理をするのですが、その直ぐ後に、また(3)の処理をするのです。 具体的なログは以下のようになりました。 【n=0】**************************// 関数の呼出しと呼出し時の引数です。 i=0  再帰前:1回:0,1,2,3 n=0      // (1)の処理です。0,1,2,3は、対象の配列です。 【n=1】************************** i=1  再帰前:2回:0,1,2,3 n=1 【n=2】************************** i=2  再帰前:3回:0,1,2,3 n=2 【n=3】************************** i=3  再帰前:4回:0,1,2,3 n=3 【n=4】************************** スタック開放:0,1,2,3 n=4   再帰後:1回:0,1,2,3 n=3     // (3)の処理です。   再帰後:2回:0,1,2,3 n=2     // なぜ連続して呼ばれているのか i=3  再帰前:5回:0,1,3,2 n=2 【n=3】************************** i=3  再帰前:6回:0,1,3,2 n=3 【n=4】************************** スタック開放:0,1,3,2 n=4   再帰後:3回:0,1,3,2 n=3   再帰後:4回:0,1,2,3 n=2     // なぜ連続して呼ばれているのか   再帰後:5回:0,1,2,3 n=1     // なぜ連続して呼ばれているのか i=2  再帰前:7回:0,2,1,3 n=1 【n=2】************************** “なぜ連続して呼ばれているのか”の部分が理解できません。予想では、再帰後の部分が一度呼ばれて、このプログラムは止まってしまうと思うですが、最後まで動きます。 なぜ、止まらずに動くのか教えてください。

  • 問題文

    問題文 a,b,cの3文字を並べて単語を作る。a,b,cをn個並べたとき、それを長さnの単語とする。例えばabac,accb,babcは長さ4の単語である。 (1) 長さ1,長さ2の単語を列挙せよ (2) aを奇数個含んでいるものをX[n],残りをY[n],とするとき、X[n+1]をX[n]とY[n]で表せ。ただし0個は偶数とする。 (3) X[n]をnの式で表せ (1)は解答することが出来ましたが、(2)でつまってしまい(3)は考えることも出来ませんでした。悔しいです。 この問題は、問題用紙でさえ回収されて、解答も解説も貰えない問題なので、どなたか解説をして頂けないでしょうか? 一応(1)の私の解答も書いておきますので、間違っていたら指摘していただけると嬉しいです。 長さ1:a,b,c 長さ2:aa,ab,ac,ba,bb,bc,ca,cb,cc

  • プログラミング for文

    プログラミング for文 プログラミングの問題です。 「自然数nを入力し、以下のようなパターンが出力されるようなプログラムをfor文を使って作成せよ。」 (例:n=3のとき) % ./a.out n: 3 * ** *** *__* **_** ****** *__*__* **_**_** ********* (例:n=4のとき) % ./a.out n: 4 * ** *** **** *___* **__** ***_*** ******** *___*___* **__**__** ***_***_*** ************ *___*___*___* **__**__**__** ***_***_***_*** **************** (_で空白を表しましたが、上手く見られないかもしれません…。小さい直角三角形が下に行くにつれ1個ずつ増え、全体的にみると大きい直角三角形が見えるイメージです。) つまり、n=3なら、 * ** *** を単位として、1~3行目にはこれが1つ、4~6行目にはこれが2つ、7~9行目にはこれが3つあります。 一般に、 * ** *** … ********(←n個) を単位とし、n^2-2~n^2行目にこれがn個あるようなパターンです。 私はまず、単位パターンをプログラムしました。 #include <stdio.h> main() { ___int n, i, j; ___printf("n: "); ___scanf("%d", &n); ___for (i=1; i<=n; i++) { ______for (j=1; j<=i; j++) { _________printf("*"); ______} ______printf("\n"); ___} } (_は空白です) しかし、単位パターンを横に2個、3個と並べるプログラムが分かりません。 さらにfor文を使い、3重、4重にするのですか?どなたか教えてください。

  • PHPのfor文とforeach文の使い方

    PHPのfor文とforeach文を使って、 ・果物の名前を4回繰り返す ・繰り返しの2回目と4回目は、"食べてください"という文字列を入れる という出力を返したいと考えています。 完成イメージは次のとおりです。 (1回目のループ) りんご ばなな ぶどう みかん (2回目のループ) 食べてください りんご ばなな ぶどう みかん (3回目のループ) りんご ばなな ぶどう みかん (4回目のループ) 食べてください りんご ばなな ぶどう みかん しかし自分が作成したプログラムでは、 次の2点について問題があります。 ・すべての繰り返しの前に"食べてください"が入ってしまう ・for文のループが止まらない 完成イメージの通りのプログラムにするためには、 どのように修正すればよろしいでしょうか? ご存知の方がいらっしゃいましたら、 ご教示願います。 ○質問の補足 自分が作成したプログラムは以下のとおりです。 for($i = 0; $i < 4; $i++) { if (($i = 1) || ($i = 3)) { echo "食べてください"; echo "</br>"; }; $fruits = array("りんご", "ばなな", "ぶどう", "みかん"); foreach ($fruits as $value) { echo $value; echo "</br>"; } } 以上、よろしくお願い申し上げます

    • ベストアンサー
    • PHP
  • 確率漸化式の問題

    漸化式の立て方を教えてください。問題文は以下の通りです。 「袋の中に 1 から 5 までの整数が 1 つずつ書かれた球が 5 個入っている。この袋から球を 1 個取り出し、その球に書かれた数を調べて袋に戻す操作を繰り返す。この操作を n 回繰り返し、取り出された球 n 個に書かれた整数の和が 3 の倍数となる確率を Pn とする。このとき、P n+1 を Pn を用いて表しなさい。」

  • n!が10の40乗で割り切れるときの最小のn

    【問題】  n!が10^40(10の40乗)で割り切れるときの最小のnを求めよ。 【解答】  10=2×5 であるからn!が10で40回割り切れるためには、  n!が5で40回割り切れなければならない。  また、そのときn!は2で40回割り切れる。     n=5  のとき 5の倍数は 5÷5=1 (個)     n=5^2  のとき 5の倍数は 25÷5=5 (個)                 25÷25=1 (個)     n=5^3 のとき 5の倍数は 125÷5=25 (個)                125÷25=5 (個)                125÷125=1 (個)  (25+5+1)+(5+1)+1+1+1=40 であるから、求める最小のnは     5^3+5^2+5+5+5=165 解答の意味がよくわかりません。 5で40回、2で40回割り切れるのはわかるが なぜ、n=5,5^2,5^3の場合だけやる? n=2,2^2,2^3,・・・は考慮しなくてよい? それに最後の結論の2行がまったく意味不明です。。 ご教授宜しくお願いします。

  • perlの「until」ループ文

    こんにちは。以下のループ文ですが、 --- print "初期値を入力してください:\n"; $number = <STDIN>; chomp($number); until ($number > 16) { print "数値:$number\n"; $number += $number; } --- 実行画面で「2」を入力すると、 数値:2 数値:4 数値:8 数値:16 のように出力されます。 なぜでしょうか?2,3,4....16じゃないの? どなたか、教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl