以前も「すべての経路を求めるには」というような質問をして再帰呼び出しにより無事解決することが出来ました。
しかし、少しわからないところがあります。
例えばaはb1とb2に接続されていてb1とb2はそれぞれc1,c2とc3,c4に接続されているとします。すべての経路は全部で4本ですね。
これを再帰呼び出しの中にprintf文を用いて表示させたところ
a->b1->c1
c2
b2->c3
c4
というような感じで表示されたと思います。これは再帰呼び出しの性質で分岐があった以前の場所へ戻って探索を続けるからだというのは理解できました。しかし、実際は
a->b1->c1
a->b1->c2
a->b2->c3
a->b2->c4
というように表示させたいです。何かこれを記憶するための変数が必要だと思うのですが、それを用いて上のように表示させるほう方法が思いつきません。
さらに、a->b2->c3というように特定の経路だけを選択して表示させたいです。アドバイスよろしくお願いします!
No.1ベストアンサー
- 回答日時:
★アドバイス(回答?)
・『記憶するための変数』が必要だと思う。→考え方は正解です。
・最初にサンプルを紹介します。
・ほぼ、『答え』なので、なぜ?ってのを自分で解読してみて下さい。
/* このファイルで使用する定数 */
#define FLG_NULL (0)
#define FLG_LEFT (1)
#define FLG_RIGHT (2)
/* 再帰呼び出しで経路を表示するサンプル */
void MySearch( struct node_t *top, struct node_t *find ) ←findが特定経路のポインタ
{
static char history[ 7 + 1 ]; ←記憶するための変数
static char *depth = history; ←記憶する現在の位置
if ( top != NULL ){
if ( top->left != NULL ){
*depth++ = FLG_LEFT;
MySearch( top->left, find );
*(--depth) = FLG_NULL;
}
if ( top->right != NULL ){
*depth++ = FLG_RIGHT;
MySearch( top->right, find );
*(--depth) = FLG_NULL;
}
if ( (top->left == NULL) || (top->right == NULL) ){
if ( (find == top) || (find == NULL) ){ ←特定の経路だけ表示、find=NULL なら全て表示
int no;
printf( "a" );
for ( no = 0 ; history[no] != FLG_NULL ; no++ ){
printf( "->%c%d", ('b' + no), history[no] );
}
printf( "\n" );
}
}
}
}
●図式例
a->b1[L]->c1[L] → a->b1->c1
a->b1[L]->c2[R] → a->b1->c2
a->b2[R]->c3[L] → a->b2->c1 ←※
a->b2[R]->c4[R] → a->b2->c2 ←※
最後に:
・上記のサンプルでは『※』印が、『c3』『c4』になりません。少しだけ工夫が必要です。
・工夫のヒントとして、カウンタ変数を static で用意して、単純に出力した順番に通し
番号を表示させれば良い。→質問者さんには、ここを宿題にします。
・解説はワザとしません。解読して理解してみて下さい。
・以上。おわり。
回答ありがとうございます!!
自分には知識と理解が足りないせいか少し理解に苦しんでいます^^;
しかし、なんとか参考にして解読したいと思います。しっかり考えて分からないならまた質問したいと思います。
参考になりました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCEL 行内のデータを2行に分けて、表を作り直したいのです。教えてください。 5 2023/06/25 14:00
- Excel(エクセル) Excelについて質問があります。 関数の数値入力についてなのですが、 b1にー c1に数値 がある 2 2023/05/28 12:30
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- Excel(エクセル) エクセルについての質問です A1に入力した数字をB1に入力した数字に+して C1に出した時に、B2に 4 2022/12/09 21:57
- Excel(エクセル) Google Spreadsheetのカスタム表示形式について 2 2023/05/20 09:10
- Excel(エクセル) エクセルで納品書を作成中ですが、関数を教えて下さい。 2 2022/09/05 10:32
- Excel(エクセル) Excelについて質問があります。 関数の数値入力についてなのですが、 b1にー c1に数値 がある 1 2023/05/28 12:13
- その他(コンピューター・テクノロジー) パリティビットの検出・訂正について 2 2022/07/09 12:35
- Excel(エクセル) スプレッドシートについて A1÷B1の値をC1に、A2÷B2をC2、A3÷B3をC3…といった感じで 1 2022/05/17 20:24
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
円の面積を求めるプログラミン...
-
基本的に問題
-
2進数の加算の繰り上がり
-
プログラミング教えてください
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
万年カレンダーのC言語プログラ...
-
C言語 プログラミング
-
三平方の定理を求めるプログラム
-
8人分のテストの点数を入力し、...
-
コマンドラインに出力した文字...
-
摂氏の値を計算するプログラム...
-
C言語での、年複利の計算方法...
-
既約分数の表示プログラム
-
C言語で四則演算を使って10を作...
-
C言語プログラミング
-
2次方程式の解の表示
-
学校の課題で
-
scanfに文字が入力されたときに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報