对于大多数更高级的阴谋者来说,这可能是一个微不足道的问题,但作为一个新手,我发现这是一个问题。
我需要一种方法来构建一个与它进入时相同顺序的新列表。例如,假设我们有一个列表'(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)
我不只是想反转使用反向过程返回的列表,而是希望首先以正确的顺序将新列表放在一起。
这有什么“技巧”,比如在其他地方进行递归调用吗?
非常感谢任何建议。
答案 0 :(得分:5)
您正在寻找使用递归遍历列表的自然方式。使用此过程作为解决方案的模板 - 它只是按照收到的方式复制列表:
(define (copy lst)
(if (null? lst)
'()
(cons (car lst)
(copy (cdr lst)))))
请注意以下几点:
cons
输出列表的新元素来实现,在这种情况下恰好是输入列表的第一个元素({{1}部分)car
部分)调用该过程来推进递归步骤像往常一样,我通过建议你看看The Little Schemer或How to Design Programs来结束我对学习如何递归思考的人的回答,这两本书将教会你如何一般地理解递归过程,使用Scheme。