方案撤消清单

问题描述 投票:2回答:2

我正在尝试使用DrRacket反转Scheme中的列表。

代码:

(define rev
  (lambda(l)
    (if (null? l)
        '()
        (append (rev (cdr l)) (list (car l))))))

如果输入(rev '(a((b)(c d)(((e)))))),则输出为(((b) (c d) (((e)))) a)

我希望它是(((((e)))(d c)(b))a)。我在这里看:How to Reverse a List?,但输出甚至更差。我究竟做错了什么?任何帮助,将不胜感激!

recursion lambda scheme racket reverse
2个回答
1
投票

这比看起来棘手,您正在尝试在列表列表上进行“深度反转”,不仅元素被反转,而且结构也被反转……在这里,请尝试此:

(define (rev l)
  (let loop ((lst l)
             (acc '()))
    (cond ((null? lst) acc)
          ((not (pair? lst)) lst)
          (else (loop (cdr lst) 
                      (cons (rev (car lst))
                            acc))))))

它按预期工作:

(rev '(a ((b) (c d) (((e))))))
=> '(((((e))) (d c) (b)) a)

0
投票

此代码将执行此操作:

(define (rev_list lst)
    (if (null? lst)
        null
        (if (list? lst)
            (append
                (rev_list (cdr lst))
                (list (rev_list (car lst)))
            )
            last
        )
    )
)

结果是:

>>> (display (rev_list '((1 7) 5 (2 4 (5 9))) ))
(((9 5) 4 2) 5 (7 1))

想法很简单:如果不是列表,则返回arg,否则返回reverse(arg)

© www.soinside.com 2019 - 2024. All rights reserved.