Scheme lisp cons和list

时间:2016-04-06 00:58:40

标签: scheme

我尝试使用关于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的初学者,我需要一个简单的帮助。 如果我打算使用这种方法,有人能建议我采用这种方法吗?

2 个答案:

答案 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))))