我怎样才能得到方案中的正偶数元素

How can i get the positive even elements in scheme

我正在尝试获取方案中的所有偶数和正数元素

我有以下代码

(define (getVals  lis)
  (cond
    ((null? lis) lis)
    (((> (car lis) 0) (even? (car lis)))
     (cons (getVals (cdr lis))))
    )
  )

要检查我的代码,我正在使用

getVals '(2 -2 4 6 5))

应该输出一个包含正数和偶数 (2 4 6) 的新列表

谢谢

最简单的方法是使用内置程序:

(define (getVals lis)
  (filter (lambda (x) (and (even? x) (positive? x)))
          lis))

如果你想从头开始实现它,你需要修复你的代码:

  • 缺少当前元素满足条件的情况(else情况)。
  • 调用cons时缺少一个参数。
  • 条件缺少 and

这就是我的意思:

(define (getVals lis)
  (cond
    ((null? lis) lis)
    ((and (even? (car lis)) (positive? (car lis)))
     (cons (car lis) (getVals (cdr lis))))
    (else (getVals (cdr lis)))))

无论哪种方式,它都按预期工作:

(getVals '(2 -2 4 6 5))
=> '(2 4 6)

并且只是添加到@OscarLopez 的回答中 - 如果您再看一眼,您会发现,getVals 只是 `filter.

的特例
(define (getVals lis)
  (cond
    ((null? lis) lis)
    ((and (even? (car lis)) (positive? (car lis)))
     (cons (car lis) (getVals (cdr lis))))
    (else (getVals (cdr lis)))))

对战:

(define (filter func lst)
  (cond
    ((null? lis) lst)
    ((func (car lst))
     (cons (car lst) (filter func (cdr lst))))
    (else (filter func (cdr lst)))))

filter func 设为 getVales,并且 func 为:

(lambda (x) (and (even? x) (positive? x)))

getVals只是过滤器的一个特例:

(define (getVals lst)
  (filter (lambda (x) (and (even? x) (positive? x))) lst))

但是你应该遵循 Lisp 语言的风格指南 - 不要对函数名称使用驼峰式命名,而更喜欢 lisp 类型的形式 get-vals.