4

リスト内のすべての奇数要素とすべての偶数要素を比較する反復手順を作成しようとしています。すべての奇数は奇数であり、すべての偶数は偶数である必要があります。最初の数は奇数でなければなりません。出力は次のようになります。

(odd-even-args? 1 2 3 4 5) --> #t
(odd-even-args? 1 2 4 4 5) --> #f
(odd-even-args? 1 0 1) --> #t

2 つの要素を this: と比較しようとしまし(and (odd? (car lst)) (even? (cadr lst))たが、 を続行する方法がわかりません(cddr lst)

4

5 に答える 5

5

even?ここに 1 つの可能性があります: すべてのリストをトラバースし、各要素が適切な述語 ( または のいずれか) を満たすかどうかを尋ね、odd?述語を交互に切り替えます。

(define (odd-even-args? . lst)
  (let loop ((lst lst)
             (is-odd? #t))
    (if (null? lst)
        #t
        (and ((if is-odd? odd? even?) (car lst))
             (loop (cdr lst) (not is-odd?))))))

上記の答えはand、再帰呼び出しを末尾の位置で使用しているため、反復的です。これは、解決策について考えていた方法と似ています。これが実際に反復プロセスであることをより明確に示す別のソリューションを次に示します。

(define (odd-even-args? . lst)
  (let loop ((lst lst)
             (is-odd? #t))
    (cond ((null? lst) #t)
          (((if is-odd? even? odd?) (car lst)) #f)
          (else (loop (cdr lst) (not is-odd?))))))

さらに別の解決策として、条件式の代わりにブール コネクタを使用します。

(define (odd-even-args? . lst)
  (let loop ((lst lst)
             (is-odd? #t))
    (or (null? lst)
        (and ((if is-odd? odd? even?) (car lst))
             (loop (cdr lst) (not is-odd?))))))
于 2013-06-15T19:08:08.230 に答える
2

ちょうど別の変種(おそらく良いものではない..)

(define (odd-even-args? . args)
  (define (iter lst)
    (cond ((null? lst) #t)
          ((null? (cdr lst)) (odd? (car lst)))
          ((and (odd? (car lst)) (even? (cadr lst))) (iter (cddr lst)))
          (else #f)))
  (iter args))
于 2013-06-15T19:16:38.517 に答える
0
(define (range start end)
  (if (>= start end)
      nil
      (cons start (range (+ start 1) end)))

(define (odd-even-args? . args)
  (apply and
         (map (lambda (value index)
                      (eqv? (even? index)
                            (even? value)))
              args
              (range 1 (+ 1 (length args))))))
于 2013-06-16T05:32:39.863 に答える
0

一般的なケースを高次関数として設計し、奇偶を実装してみませんか? 特例として?そうすれば、even-odd?、square?-tan?、または prime?-carmicheal? を実装することもできます。非常に簡単に。

(define (predx?-predy? predx predy)
 (lambda L
  (let loop ((lst L) (pred?1 predx) (pred?2 predy))
   (if (null? lst)
       #t
       (and (pred?1 (car lst)) (loop (cdr lst) pred?2 pred?1)))))) 
 ;;flip  preds each recursion

(define odd-even? (predx?-predy? odd? even?))

(define even-odd? (predx?-predy? even? odd?))

(define square-tan (predx?-predy? square? tan?))

(define prime?-Carmichael? (predx?-predy? prime? (lambda (x) (and (not (prime? x)) (fermat-prime? x)))))
于 2013-06-17T14:05:18.630 に答える