2

对于这里的大多数更高级的计划者来说,这可能是一个微不足道的问题,但作为一个新手,我发现这是一个问题。

我需要一种方法来构建一个新列表,它的顺序与它进入时的顺序相同。例如,假设我们得到了一个列表'(1 2 0 3 4 0 0 5)。但是遍历列表并将 cdr 作为第一个参数传回最终会向后构造新列表。

这是代码中的示例:

我将一个需要对其进行工作的“旧列表”传递给它,并将一个空列表作为“新列表”传递给它,以形成并返回。

请注意,取出 0 只是作为新列表必须满足的“某些条件”

  (define (form-new-list old-list new-list)
    (cond ((null? old-list) new-list)
          (else
           (if (eq? (car old-list) 0) (form-new-list (cdr old-list) new-list)
               (form-new-list (cdr old-list) (cons (car old-list) new-list))))))

  ;test
  (form-new-list '(1 2 0 3 4 0 0 5) '()) ; gives (5 4 3 2 1)
  ;but want (1 2 3 4 5)

我不只是想反转使用反向过程返回的列表,而是希望首先以正确的顺序将新列表放在一起。

这是否有某种“技巧”,比如在其他地方进行递归调用?

任何意见是极大的赞赏。

4

1 回答 1

5

您正在寻找使用递归遍历列表的自然方式。将此过程用作您的解决方案的模板 - 它只是按照收到的原样复制列表:

(define (copy lst)
  (if (null? lst)
      '()
      (cons (car lst)
            (copy (cdr lst)))))

请注意以下几点:

  • 当输入列表为空时递归结束,并且鉴于我们正在构建一个新列表,返回的正确值是空列表
  • 我们有兴趣构建一个新列表,我们通过cons为输出列表添加一个新元素来做到这一点,在这种情况下,它恰好是输入列表的第一个元素(它的car一部分)
  • 最后,递归步骤通过使用输入列表的其余部分(它的cdr一部分)调用过程来推进

像往常一样,我建议你看一下The Little SchemerHow to Design Programs来回答人们学习如何递归思考的问题,这两本书都会教你如何使用 Scheme 来理解递归过程。

于 2012-11-06T02:11:50.510 回答