我正在尝试反转Scheme中的链表;我不知道为什么这不起作用。顺便说一下,我正在使用Chez Scheme。它给了我这个错误:异常:反向链表中#procedure reverse ll的参数数量不正确。scm:59。有人知道发生了什么吗?谢谢
(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
过程处理。相反,您希望输入中有一个空列表来触发累加器的返回:
(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)