反转 Scheme 中的链表

Reverse a linked list in Scheme

我正在尝试反转 Scheme 中的链表;我不知道为什么这不起作用。顺便说一句,我正在使用 Chez Scheme。它给我这个错误:异常:在反向链接-list.scm:59 处的#procedure reverse-ll 的参数数量不正确。有谁知道发生了什么事?谢谢!

(define pi '(3 1 4 1 5 9 2 6 5 3 5))

(define reverse-ll
  (lambda (orig rev)
                (if (null? (cdr orig)) rev
                           (reverse-ll (cons (car orig) rev)))))

(define reverse-pi (reverse-ll pi '()))
(display reverse-pi)

错误表明对 reverse-ll 的调用没有足够的参数,并且只有两个这样的调用。调用 (reverse-ll pi '()) 没问题,因为 reverse-ll 有两个列表参数。另一个电话是问题:

(reverse-ll (cons (car orig) rev))

这里reverse-ll只给出了一个参数:(cons (car orig) rev)。此表达式将输入列表的第一个元素添加到累加器。但是代码缺少递归步骤的简化输入列表。相反:

(reverse-ll (cdr orig) (cons (car orig) rev))

还有一个问题。如所写,代码不包括反向输出中输入列表的最后一个元素。这是因为基本情况:

(if (null? (cdr orig)) rev ;; )

在此代码中,当 (cdr orig)'() 时达到基本情况,并且当输入列表已减少到一个元素的长度时会发生这种情况。 reverse-ll 过程不会处理最后一个元素。相反,您希望输入中有一个空列表来触发累加器的 return:

(define reverse-ll
  (lambda (orig rev)
                (if (null? orig) rev
                           (reverse-ll (cdr orig) (cons (car orig) rev)))))

这是结果,同时显示了输入和输出:

> (load "scratch.ss")
(3 1 4 1 5 9 2 6 5 3 5)
(5 3 5 6 2 9 5 1 4 1 3)