![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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ランキング
-
awkスクリプトでダブルクォーテ...
-
LISPによる横型探索
-
DOSコマンドで、標準出力を出力...
-
エクセルVBAで素数だけを出力す...
-
VBAで巨大なファイルの途中から...
-
ファイル名を複数個配列で確保...
-
batファイルでrenameができませ...
-
Windowsで複数のファイルを同じ...
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
AutoNts
-
ファイルを分割する。
-
perlでcsvファイルを読む(ダブ...
-
cgiで表示するhtmlページ内でバ...
-
全角と半角文字が混在している...
-
エクセルVBA コードが同じでも...
-
Visual Basicを使って三平方の...
-
readdir()で得られるファイル・...
-
Perlで特定行から特定行までを...
-
CSVが可変長の場合の検索方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
sprintfについて
-
教えて!perlから.exeファイル...
-
重複するデータを抽出できる秀...
-
log2の「正確な」計算方法
-
DOSコマンドで、標準出力を出力...
-
文字コードの変換(Shift-JISか...
-
perlでの文字列抽出
-
至急お願いします。C言語で.img...
-
ダイアモンド演算子<>に対するb...
-
コマンドプロンプトで行が見え...
-
Perlで着メロDLカウント
-
perlのpushについてです。
-
perlでcsvの出力について
-
CGIから外部コマンド実行時の標...
-
ドメインからIPアドレスあるい...
-
MySQLに画像を格納してperlで取...
-
perlでcsvの指定フィールドに書...
-
htmlから、ファイル、もしくはC...
おすすめ情報