考虑:
(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))
。我如何更改代码以便嵌套列表也可以反转?
答案 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)
并使用与创建相同的过程来对元素执行相反操作好。除此之外,它非常相似。