这是一种可能性:遍历所有列表,询问每个元素是否满足适当的谓词(even?
或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
在尾部位置使用带有递归调用的 an,因此它是迭代的 - 它类似于您考虑解决方案的方式。这是另一个解决方案,它更明确地表明这确实是一个迭代过程:
(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?))))))