LISPのSchemeをつかって横型探索で探索した経路を出力するプログラムをつくっているのですが、
今は探索が終わると終了するとCLOSEDの中を表示するプログラムしかできていません
もしこれに探索した経路の出力をする機能を加える場合どうすればいいですか?
OPEN→待ちリスト
CLOSED→展開済みリスト
GOAL→目標地点
OP→オペレータの集まり
nとopから展開の結果をだす
(define (tenkai n op)
(tenkai2 n op '()))
(define (tenkai2 n op kekka)
(if (null? op)
kekka
(if (= n (car (car op)))
(tenkai2 n (cdr op) (cons (car (cdr (car op))) kekka))
(tenkai2 n (cdr op) kekka))))
(define (yokogata open goal op closed)
(if (null? open)
'sippai
(if (= (car open) goal)
(display closed)
(yokogata
(append (cdr open) (tenkai (car open) op))
goal
op
(append closed (list (car open)))))))
No.1ベストアンサー
- 回答日時:
う~~ん……。
こう言うのって検索対象の「データ構造」が分かんないと何とも言えないですよね。
結局二分木探索でしょ?その二分木探索対象のリストが「どう言う構造なのか?」で全然違うんですよ。表現方法が色々ある。だから特定出来ませんね。
また、opと言われても「一体何をさせたいのか?」不明です。演算子の集合、っつってもどう言う集合なんだか皆目不明ですし。
一般的な幅優先探索の簡単なコードは、ポール・グレアムの「ANSI Common Lisp」によれば次のような感じです。Scheme用に書き換えてあります。
(define (shortest-path start end net)
(breadth-first-search end (list (list start)) net))
(define (breadth-first-search end queue net)
(or (null? queue)
(let ((path (car queue)))
(let ((node (car path)))
(if (eqv? node end)
(reverse path)
(breadth-first-search end
(append (cdr queue)
(new-paths path node net))
net))))))
(define (new-paths path node net)
(map
(lambda (n)
(cons n path))
(cdr (assoc node net))))
netに探索したい二分木リスト、startに探索始点、endに探索終点を与えると経路のリストを返します。
例えば、家系図リスト、familyを次のように設定します。
(define family '((Harry Jane Bill) (Jane Joe Diane) (Joe '() '()) (Dian '() ())
(Bill Julia Mike) (Julia Frank Susan) (Frank Anne '()) (Susan '() '())
(Mike '() '())))
このリストの各要素は(ノード 子供左 子供右)となっていて、左の枝から順に整列しています。
この二分木リストをnetに与え、例えばBillからFrankへの系図を辿るには、
> (shortest-path 'Bill 'Frank family)
(Bill Julia Frank)
となりますね。つまり、Billの子供の一人がJuliaで、Juliaの子供がFrankです。つまり、FrankはBillの孫ですよね。
こう言う感じで経路を記録していくんですが、参考になったでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- 数学 作図について 写真の垂線の作図についてで、 ②の半径opの円を書くと書いてありますが、opにしなくて 6 2023/01/07 01:57
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- アニメ 鬼滅の刃 新OPについて 2 2023/04/19 18:26
- 出前・デリバリー 皆さんはco-opデリ 1 2023/04/19 18:47
- 数学 このようなベクトルOPをOA OBで表す問題でよく、図のようにs:1-sで置くと思うんですけど、AP 4 2022/08/08 10:25
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 数学 ベクトルの質問です。 AP=AO+OP=OP−OAは理解できます。 しかし、PA+2PB+3PC=P 2 2023/04/03 04:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl<->Oracle間での文字化けに...
-
awkスクリプトでダブルクォーテ...
-
教えて!perlから.exeファイル...
-
sprintfについて
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
batファイルでrenameができませ...
-
close()で例外が投げられる理由
-
エクセルVBA コードが同じでも...
-
ListBoxのデータを高速でファイ...
-
Perlで特定行から特定行までを...
-
openした後、closeしないでプロ...
-
Firefox で file:// で始まる U...
-
perlで、後ろの行を読んで、前...
-
csvファイルの横方向への改行に...
-
C言語で特定の行を抽出する方法...
-
perlで複数行のデータを自由に...
-
ifstream を利用した1行分のテ...
-
perlをwindows環境でshift-jis...
-
RSS自動生成で文字化け
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
DOSコマンドで、標準出力を出力...
-
エクセルVBAで素数だけを出力す...
-
教えて!perlから.exeファイル...
-
sprintfについて
-
Perlでファイルの末尾から指定...
-
CGIから外部コマンド実行時の標...
-
重複するデータを抽出できる秀...
-
ファイル出力の改行コードをLFに
-
timeコマンドの結果をテキスト...
-
sprintfで10進数を桁数指定で16...
-
log2の「正確な」計算方法
-
機器のI/OをArduinoでSDに記録...
-
Perl<->Oracle間での文字化けに...
-
Perl中で teeを使っても戻り値...
-
テキストファイルから日本語部...
-
バッチファイルで、記号を含む...
-
htmlから、ファイル、もしくはC...
-
perlでの出力先設定
-
標準エラーと標準出力をファイ...
おすすめ情報