2017-10-28 17 views
1

書く必要がある関数は、パターン(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)のような入力は不正確な結果を得るでしょう。また、部分的な結果がリストに追加されています。

誰かが私を正しい方向に向けることができますか?部分パターンを見つけたときに完全なパターンを検索するにはどうすればいいですか?

+0

でそれをテストすることができる唯一のものだったのLispで吸いますcar L) '、最初の' cond'のelse節の余分な括弧、最後の式 '(cons((car L)...)'これはまったく動作しているLispの実装は何ですか? – verdammelt

答えて

0

これは、Common Lispで動作するはずです - 私はここで使用している技術は、それがラケットにある現在の検索位置

(defun find-pattern-helper (xs ys src) 
    (cond ((null xs) 
     src) 
     ((null ys) 
     nil) 
     ((eq (car xs) (car ys)) 
     (find-pattern-helper (cdr xs) (cdr ys) src)) 
     (T 
     (find-pattern-helper pat (cdr src) (cdr src))))) 

(defun find-pattern (pat src) 
    (find-pattern-helper pat src src)) 

または、ここを追跡ヘルパーでsrcのコピーに沿って通過しています。 ..私はちょっと(ので、これは私が実際にこの試みは、同様の式 `(EQ(車P)にコンマをいくつかの構文エラーを持っているように見えます

#lang racket 

(define (find-pattern pat src) 
    (let loop ((xs pat) (ys src) (src src)) 
    (cond ((null? xs) 
      src) 
      ((null? ys) 
      '()) 
      ((eq? (car xs) (car ys)) 
      (loop (cdr xs) (cdr ys) src)) 
      (#t 
      (loop pat (cdr src) (cdr src)))))) 

(find-pattern '(h e l p) '(i n e e d h e l p p l e a s e)) 
;; => '(h e l p p l e a s e) 

(find-pattern '() '(h a y s t a c k)) 
;; => '(h a y s t a c k) 

(find-pattern '(h a y s t a c k) '(h a y)) 
;; => '() 
関連する問題