反转 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)
我正在尝试反转 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)