创建一个lisp函数,该函数从列表中给出偶数列表

时间:2019-11-03 22:04:14

标签: recursion scheme racket

我想为类创建一个函数,该函数将两个参数LL1作为列表,并将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)
   ))

1 个答案:

答案 0 :(得分:2)

我假设您想使用L1作为累加器,最后返回其内容。

关于您的代码:

  1. cond的第一子句中检查一次L是否为空(null?)就足够了。

  2. 要添加列表,可以使用
  3. append。在您的情况下,您添加了一个元素,因此cons更好。

  4. 您不必取数字的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” 这本书。阅读后,即使在睡眠中,您也可以编写任何类型的递归函数;)