没有 'appent' 或 'list' 的顶层反向列表
Reverse list on top level without 'appent' or 'list'
我做了一些可以反转简单列表的函数,比如 (q w e r t y)
根据它应该正确处理的任务:空列表、列表、对、不正确的列表。
但现在它在不正确的列表上失败了,比如 (q w e r t . y) 或 pairs.
如何处理这种情况?
我的代码:
(define myInverse2
(lambda (original result)
(
cond ((null? original)
result )
(#t
(myInverse2 (cdr original) (cons (car original) result)) )
) ) )
和 dr Racket 输出:
您的代码失败是因为当 original
不是 null?
时,您假设您可以使用它的 cdr
,但这并不总是得到保证。您可以修改代码以区分 cons?
值和其他值。
但首先,问问自己这是否有必要,以及与您的一些输入相反的情况。简单对 (x . y)
的逆向是 (y . x)
.
但是反过来呢
(q w e r t . y)
?我希望 reverse
是它自己的反函数(即对合),所以你总是有:
(equal? x (reverse (reverse x)))
...如果上面的反面是(y t r e w q)
,那么你就失去了这个属性。或者,您可以选择让结果为 (y t r e w . q)
,这在反转时返回您的结果。这就是为什么您首先必须选择函数的含义。然后,如果上面的方法是你想采用的方法,那么改变应该很容易;例如在 cond
中添加一个匹配 (cons? original)
.
的案例
我做了一些可以反转简单列表的函数,比如 (q w e r t y)
根据它应该正确处理的任务:空列表、列表、对、不正确的列表。
但现在它在不正确的列表上失败了,比如 (q w e r t . y) 或 pairs.
如何处理这种情况?
我的代码:
(define myInverse2
(lambda (original result)
(
cond ((null? original)
result )
(#t
(myInverse2 (cdr original) (cons (car original) result)) )
) ) )
和 dr Racket 输出:
您的代码失败是因为当 original
不是 null?
时,您假设您可以使用它的 cdr
,但这并不总是得到保证。您可以修改代码以区分 cons?
值和其他值。
但首先,问问自己这是否有必要,以及与您的一些输入相反的情况。简单对 (x . y)
的逆向是 (y . x)
.
但是反过来呢
(q w e r t . y)
?我希望 reverse
是它自己的反函数(即对合),所以你总是有:
(equal? x (reverse (reverse x)))
...如果上面的反面是(y t r e w q)
,那么你就失去了这个属性。或者,您可以选择让结果为 (y t r e w . q)
,这在反转时返回您的结果。这就是为什么您首先必须选择函数的含义。然后,如果上面的方法是你想采用的方法,那么改变应该很容易;例如在 cond
中添加一个匹配 (cons? original)
.