我想为类创建一个函数,该函数将两个参数L
和L1
作为列表,并将L
中的所有偶数放入L1
中。
我已经尝试了几个小时才能使其正常工作,但不幸的是我不能。
这是我的计划代码:
(define (pair L L1)
(cond
((and (not (empty? L)) (= (modulo (first L) 2) 0))
(begin (append (list (first L)) L1) (pair (rest L) L1)))
((and (not (empty? L)) (= (modulo (first L) 2) 1))
(pair (rest L) L1))
(else L1)
))
答案 0 :(得分:2)
我假设您想使用L1
作为累加器,最后返回其内容。
关于您的代码:
在cond
的第一子句中检查一次L
是否为空(null?
)就足够了。
append
。在您的情况下,您添加了一个元素,因此cons
更好。
您不必取数字的modulo
来检查它是否为偶数。 even?
谓词中有内置。
因此,在考虑了所有这些因素之后,您的代码应如下所示:
(define (pair L L1)
(cond ((null? L) L1)
((even? (first L))
(pair (rest L) (cons (first L) L1)))
(else (pair (rest L) L1))))
现在让我们对其进行测试:
> (pair '(0 1 2 3 4 5 6 7) '())
(6 4 2 0)
如您所见,它以相反的顺序返回数字。这是因为,当我们从头到尾向下移动列表L
时,我们将cons
的新值移到列表append
的头部(而不是像L1
这样的尾部) 。要解决此问题,只需在第一个(reverse L1)
子句中cond
,而不是简单地返回L1
。
我强烈推荐“ Little Schemer” 这本书。阅读后,即使在睡眠中,您也可以编写任何类型的递归函数;)