计划反转列表
Scheme reverse a list
我正在尝试使用 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? 但我得到更糟糕的输出。我究竟做错了什么?任何帮助,将不胜感激!
这比看起来更棘手,您正在尝试对列表的列表执行 "deep reverse",不仅元素被颠倒,而且结构也被颠倒……在这里,试试这个:
(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)
这段代码可以做到:
(define (rev-list lst)
(if (null? lst)
null
(if (list? lst)
(append (rev-list (cdr lst)
(list (rev-list (car lst))))
lst)))
结果是:
>>> (display (rev-list '((1 7) 5 (2 4 (5 9))) ))
(((9 5) 4 2) 5 (7 1))
思路很简单:Return如果不是列表,arg
,否则returnrev-list(arg)
。
我正在尝试使用 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? 但我得到更糟糕的输出。我究竟做错了什么?任何帮助,将不胜感激!
这比看起来更棘手,您正在尝试对列表的列表执行 "deep reverse",不仅元素被颠倒,而且结构也被颠倒……在这里,试试这个:
(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)
这段代码可以做到:
(define (rev-list lst)
(if (null? lst)
null
(if (list? lst)
(append (rev-list (cdr lst)
(list (rev-list (car lst))))
lst)))
结果是:
>>> (display (rev-list '((1 7) 5 (2 4 (5 9))) ))
(((9 5) 4 2) 5 (7 1))
思路很简单:Return如果不是列表,arg
,否则returnrev-list(arg)
。