比较方案列表中的奇数和偶数

Ats*_*Ats 4 scheme

我正在尝试进行迭代过程,比较列表中的每个奇数和每个偶数元素.每个奇数应该是奇数,每个偶数应该是偶数.第一个数字必须是奇数.输出应该是这样的:

(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
Run Code Online (Sandbox Code Playgroud)

我试着用这个比较两个元素:(and (odd? (car lst)) (even? (cadr lst))但我不知道如何继续(cddr lst).

Ósc*_*pez 5

这是一种可能性:遍历所有列表,询问每个元素是否满足相应的谓词(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?))))))
Run Code Online (Sandbox Code Playgroud)

上面的答案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?))))))
Run Code Online (Sandbox Code Playgroud)

还有另一个解决方案,使用布尔连接器而不是条件表达式:

(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?))))))
Run Code Online (Sandbox Code Playgroud)