我正在尝试撤消列表,这是我的代码:
(define (reverse list)
(if (null? list)
list
(list (reverse (cdr list)) (car list))))
Run Code Online (Sandbox Code Playgroud)
所以,如果我输入(反向'(1 2 3 4)),我希望它出来(4 3 2 1),但现在它不给我那个.我做错了什么,我该如何解决?
Ósc*_*pez 13
重复列表的自然方式不是解决此问题的最佳方法.append正如@lancery所接受的答案中所建议的那样使用也不是一个好主意 - 无论如何,如果你在Scheme中学习你的方式,那么如果你试图自己实现解决方案,那么我会告诉你该怎么做,但首先是一个提示 - 不要list用作参数名称,这是一个内置的程序,你将覆盖它.比方说,使用其他名称lst.
这是简单的逆转,其累积consing的结果,在每个元素的辅助程序的方式列表头的结果,这将有扭转名单的影响-顺便说一句,助手程序是尾递归.这是一般的想法,填补空白:
(define (reverse lst)
(<???> lst '())) ; call the helper procedure
(define (reverse-aux lst acc)
(if <???> ; if the list is empty
<???> ; return the accumulator
(reverse-aux <???> ; advance the recursion over the list
(cons <???> <???>)))) ; cons current element with accumulator
Run Code Online (Sandbox Code Playgroud)
当然,在现实生活中你不会reverse从头开始实现,有一个内置的程序.