cond with Scheme中的列表

时间:2014-03-11 01:53:07

标签: list scheme lisp conditional

问题采用一个列表,例如L =(4 11 16 22 75 34)并进行条件测试(模数2)然后返回一个列表,列表中包含通过测试的所有项目,例如newL =(4 16 34) )

以下是代码:

(define clean-list
  (lambda (x)
    (list x (test x))))

(define test
  (lambda (x)
    (cond (= 0 (modulo (car x) 2)) 
          (cons (car x) (test(cdr x)))   
          (else (test(cdr x))))
    ))

输出:

   ((4 11 16 22 75 34) 0) 

我调试了代码,它变成了(modulo(car x)2)然后返回到clean-list并退出,所有在第一次运行之后,请解释一下以及为什么它在列表末尾返回0。此外,任何反馈或代码改进都将受到赞赏。

2 个答案:

答案 0 :(得分:3)

你错过了一组括号。你也错过了一个触底反复的测试。

(define test
  (lambda (x)
    (cond ((eq? x '()) '())
          ((= 0 (modulo (car x) 2)) 
           (cons (car x) (test(cdr x))))
          (else (test(cdr x))))
    ))

DEMO

cond的一般语法是:

(cond (<test1> <result1>)
      (<test2> <result2>)
      ...)

在您的代码中<test1>只是=,而不是(= 0 (modulo (car x) 2))

答案 1 :(得分:0)

这是函数的尾递归版本。

(define test
  (lambda (x)

    (define (helper in out)
      (if (null? in)
        out
        (if (= 0 (modulo (car in) 2))
          (helper (cdr in) (append out (list (car in))))
          (helper (cdr in) out))))

    (helper x '())
    ))

(define clean-list
  (lambda (x)
    (list x (test x))))

(write (clean-list '(4 11 16 22 75 34)))

输出:

((4 11 16 22 75 34) (4 16 22 34))

PS。当我在repl.it测试代码时,我不得不将modulo更改为mod