0

リスト内の 1 の数を使用foldrして検索する方法を見つけました。lambdaただし、if条件またはその他の方法を使用して、リストに 1 しかないかどうかを確認する方法.

(define (exactlyone L)
  (foldr (lambda (elem count) (if (equal? elem 1) (+ count 1) count))
        0 L)

)  

count可能であれば、if 条件で値を使用するにはどうすればよいですか?

4

3 に答える 3

2

1すべてのリストをトラバースするまで sの数を確認できないため、必然的にfoldrすべてのアイテムを消費する必要があります。その後、の戻り値がcountだったかどうかをテストするのは簡単なことです1:

(define (exactlyOne L)
  (= 1
     (foldr (lambda (elem count)
              (if (equal? elem 1)
                  (+ count 1)
                  count))
            0
            L)))

もちろん、最も簡単な方法は、count一からやり直すのではなく、既存の手順 ( など) を使用することです。これはRacketで機能します:

(define (exactlyOne lst)
  (= 1
     (count (curry equal? 1) lst)))

例えば:

(exactlyOne '(1 2 3))
=> #t

(exactlyOne '(1 2 3 1))
=> #f
于 2016-10-04T15:35:30.590 に答える