書く必要がある関数は、パターン(p)とリスト(L)の2つの引数をとります。私はパターンの後ろのすべてと同様、パターンを含むリストの部分を探したい。パターンがリストにない場合は、nilを返します。基本的なlispだけを使ってリスト内のパターンを再帰的に見つけて返します
例:
入力:(find_pattern '(ヘルプ)'(ineedhelpplease))
出力:「私は、基本的なLispの関数を使用することができます
(helpplease)(指揮、車、CDR 、cons、null、eq、/ =)。それは再帰的である必要があり、setqのようなものを使うことはできません。
私の戦略:
私はあることを例を推論:
P = nilを、L = nilを:パターンは
ゼロので、リターン、リストの末尾にある場合に発生しますp = nil、L =(none-nil値):これはパターンがリストの真ん中にある場合に発生するため、Lを返します。
p =(非ゼロ値)、L = nil:パターンが見つかりませんでした戻り値なし
p =(非nil値)、L =(非nil値):pとLの両方の車が同じ場合、pとLのcdrを再帰的に呼び出します。それらが同じではなく、再帰的にpとLのCDRと呼ん
私の試み:私は部分パターンマッチを見つけた場合
、私はに戻ることはありません:これを実行せずに
(defun find_pattern (p L)
(cond((null p)
(cond ((null L) nil) ; p = nil, L = nil
(T L))) ; p = nil, L != nil
((T
(cond ((null L) nil) ; p != nil, L = nil
((eq (car p), (car L)) ; p!= nil, L != nil
(cons ((car L) (find_pattern (cdr p) (cdr L))))))
)
私はすでにいくつかの問題を参照してください完全なパターン。したがって '(a b c)'(d a b d a b c)のような入力は不正確な結果を得るでしょう。また、部分的な結果がリストに追加されています。
誰かが私を正しい方向に向けることができますか?部分パターンを見つけたときに完全なパターンを検索するにはどうすればいいですか?
でそれをテストすることができる唯一のものだったのLispで吸いますcar L) '、最初の' cond'のelse節の余分な括弧、最後の式 '(cons((car L)...)'これはまったく動作しているLispの実装は何ですか? – verdammelt