问题接受一个列表,例如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并退出,所有这些都是在第一次运行之后,请解释一下为什么它在list的末尾返回0。此外,任何反馈或改进代码将不胜感激。
您缺少一组括号。您还错过了对递归触底的测试。
(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))
。
这是该函数的尾部递归版本。
(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))
p。当我在repl上测试代码时。因此,我必须将modulo
更改为mod
。