问题采用一个列表,例如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。此外,任何反馈或代码改进都将受到赞赏。
答案 0 :(得分:3)
你错过了一组括号。你也错过了一个触底反复的测试。
(define test
(lambda (x)
(cond ((eq? x '()) '())
((= 0 (modulo (car x) 2))
(cons (car x) (test(cdr x))))
(else (test(cdr x))))
))
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
。