我尝试使用关于cons,cdr,car的最基本概念来反转方案中的列表。
在此,l-orig
是要撤消的列表,l-count
充当计数器。
我的代码在这里:
(define (rev l-orig l-count)
(
if (null? l-count)
(cons l-orig '())
(rev (cons (cdr l-orig) (car l-orig)) (cdr l-count))
)
)
(display (rev '(1 2 3 4 5) '(1 1 1 1 1)))
输出为(((2 3 4 5) . 1))
老实说,我是lisp的初学者,我需要一个简单的帮助。
如果我打算使用这种方法,有人能建议我采用这种方法吗?
答案 0 :(得分:1)
您在累加器参数的帮助下尝试使用尾递归来反转列表。最好的方法是遍历原始列表,并在累加器的头部遍历每个元素cons
,这些元素将在最后返回:
(define (rev l-orig l-count)
(if (null? l-orig)
l-count
(rev (cdr l-orig) (cons (car l-orig) l-count))))
请注意,累加器以空列表的形式开始,这对于cons
每个新元素都是完美的:
(rev '(1 2 3 4 5) '())
=> '(5 4 3 2 1)
答案 1 :(得分:0)
奥斯卡的回答是正确的。您可以使用辅助函数,这样您就不必每次都传入一个空的累加器:
(define (rev xs)
(rev-accum xs '()))
(define (rev-accum xs accum)
(if (null? xs)
accum
(rev-accum (cdr xs) (cons (car xs) accum))))