1

リストがジッパーとして定義されている場合に TRUE を返す述語関数を作成しようとしています。ジッパーは、各要素が正確に 2 つの要素を持つリストであり、任意の式である適切なリストとして定義されます。

例として

(zipper? '((a 1)(b 2)))
#t
(zipper? '((a (1)) ((b) 2)))
#t
(zipper? '((a 1 2)(b 1)))
#f

最初に引数リストがいっぱいかどうかを確認してfalseを返し、次にリストのcarを要素の長さにチェックし、リストのcdrを関数に戻そうとしましたが、実行に問題があります。

(define (zipper? l)
  (if (empty? l)
    #f
  (if (> 1 (length car(l)))
    #t
  (zipper? (cdr (l))))))

私が間違っていることと、それを修正する方法を教えてください。私はまだスキームを学んでいます。

4

2 に答える 2

2

この場合、cond一連のネストされたifs よりも a を使用する方が適切です。これらは問題を引き起こします。また、現在の要素が「zip」であるかどうかをテストする述語を別のプロシージャに抽出することをお勧めします。このようなもの:

(define (zip? e)
  (and (list? e)
       (= (length e) 2)))

(define (zipper? lst)
  (cond ((null? lst) #t)
        ((not (zip? (car lst))) #f)
        (else (zipper? (cdr lst)))))

もちろん、この問題を解決する方法は他にもいくつかあります。たとえば、条件の代わりにブール コネクタを使用します。

(define (zipper? lst)
  (or (null? lst)
      (and (zip? (car lst))
           (zipper? (cdr lst)))))

または Racket を使用andmap(利用できない場合は SRFI-1 を使用every):

(define (zipper? lst)
  (andmap zip? lst))
于 2013-06-23T23:49:13.877 に答える
1

あなたの括弧は間違っています

(define (zipper? l)
  (if (empty? l)
    #f
  (if (> 1 (length (car l)))
    #t
  (zipper? (cdr l))))))

関数は常に式の最初の要素であり、残りは引数です。そして、それは仕様と完全には一致しません

(define (zipper? l)
  (if (empty? l)
    #t
    (if (not (=  2 (length (car l))))
        #f
        (zipper? (cdr l))))))
于 2013-06-23T23:37:57.893 に答える