2017-04-23 10 views
1

私は、リスト内の1つの要素にマッチすることができない関数に問題があります。リストのすべての値を照合できるようにしたい。スキーム真を返す前に、リスト内の指定されたすべての値を一致させる

は言うX1(1111。9999)、彼らは両方のリスト×2一致する必要があります(1111。124123。3781283。1298394。9999)だけにして

リターンは#f #tを返した場合、X2(1111。124123。3781283 。1298394)はこれのようです。

何か助けていただければ幸いです。ここで

+1

何が変なフォーマットですか? – Sylwester

+0

申し訳ありませんが、それは言語に関係のないリストの単なる表現でしたが、問題はスキーム、lisp、ラケットに関連しています –

答えて

0

私はだと思います。問題を正しく理解しています。もしそうなら、あなたは建てインせずにこれを書きたい場合は、我々はそれが最高だオールインワンの手順

そうでない場合
(define (match-all xs ys) 
    (define (member? x ys) 
    (cond ((empty? ys) #f) 
      ((eq? x (car ys)) #t) 
      (else (member? x (cdr ys))))) 
    (define (loop xs ys) 
    (cond ((empty? xs) #t) 
      ((member? (car xs) ys) #t) 
      (else (loop (cdr xs) ys)))) 
    (loop xs ys)) 

を書くことができますandmap

(define (match-all xs ys) 
    (not (not (andmap (λ (x) (member x ys)) 
        xs)))) 

(match-all '(1 4 5) '(0 1 2 3 4 5 6)) ;; #t, each (! 4 5) is found in (0 1 2 3 4 5 6) 
(match-all '(1 5 9) '(0 1 2 3 4 5 6)) ;; #f, 9 is not found in (0 1 2 3 4 5 6) 

をチェックしてください汎用プロシージャを実装し、ジェネリックを使用して新しいプロシージャを構築します。これは、複雑さを減らすことができますし、私はあなたがリスト1のすべての要素がlist2の中に見られる場合にのみ、trueを返したい正しく理解していれば

(define (andmap f xs) 
    (if (empty? xs) 
     #t 
     (let (x (f (car xs))) 
     (if (eq? #f x) 
      #f 
      (and x (andmap f (cdr xs))))))) 

(define (member? x ys) 
    (cond ((empty? ys) #f) 
     ((eq? x (car ys)) #t) 
     (else (member? x (cdr ys))))) 

(define (match-all xs ys) 
    (andmap (lambda (x) (member? x ys)) xs)) 
+0

私はスキームに慣れていないので、入力リストを再帰し、ビッグリストのすべての値と一致する関数は、#tを返します。ある要素が真であれば直ちに戻りますが、入力内のすべてをチェックしたいという作業関数があります。 ..ありがとう –

+0

@ user2714430 andmapを使用しないアップデートを作った – naomik

+0

助けてくれてありがとう! –

0

は小さな一例です:

(define (example xs) 
    (match xs 
    [(list 1111 middle ... 9999) middle] 
    [_       #f])) 

、使用中:

> (example '(1111 2 3 4 9999)) 
'(2 3 4) 
> (example '(1111 2 3 4 5)) 
#f 

注真ん中の部分はリストが一致した場合に返さあること。 リストが一致しない場合は、falseが返されます。

0

低い認知的負荷を保持します。それが正しければ、match-allには次の3つのオプションを持つcondステートメント(またはそれに相当する構造)が必要です:

match-all applied to list1 and list2 is 
    if list1 is empty return true 
    elseif the car of list1 is not a member of list2 return false 
    otherwise return match-all applied to the cdr of list1 and all of list2 
関連する問題