如何在Scheme中反转嵌套列表

时间:2016-10-18 15:37:13

标签: scheme racket reverse nested-lists

考虑:

(define (nested-reverse lst)
(cond ((null? lst) '())
    ((list? (car lst)) (nested-reverse (car lst)))
    (else
     (cons (nested-reverse (cdr lst))
           (list (car lst))))))

当我输入时,

 (nested-reverse '((a b c) 42))

它给了我((() 42) (a b c))。它应该给我(42 (c b a))。我如何更改代码以便嵌套列表也可以反转?

1 个答案:

答案 0 :(得分:0)

请注意,列表(1 2 3)(cons 1 (cons 2 (cons 3 '())))。使用append是如何反转列表的一个非常糟糕的选择,因为append的实现如下:

(define (append lst1 lst2)
  (if (null? lst1)
      lst2
      (cons (car lst1) (append (cdr lst1) lst2))))

列表可以从第一个元素向末尾迭代,而只能反向生成。因此,明显的无递归反转看起来像这样:

(define (simple-reverse lst)
  (let loop ((lst lst) (result '()))
    (if (null? lst)
        result
        (loop (cdr lst) (cons (car lst) result)))))

要使其适用于嵌套列表,请检查是否需要通过检查它是否需要反转(car lst)并使用与创建相同的过程来对元素执行相反操作好。除此之外,它非常相似。