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?))))))