我做了一些可以反转简单列表的功能,比如(q w e r t y)
通过任务,它应该正确处理:空列表,列表,对,不正确的列表
但是现在它在不正确的列表上失败了,例如(q w e r t.y)或对
如何处理这种情况?
我的代码:
(define myInverse2
(lambda (original result)
(
cond ((null? original)
result )
(#t
(myInverse2 (cdr original) (cons (car original) result)) )
) ) )
Dr Racket输出:
答案 0 :(得分:2)
您的代码失败,因为当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)
匹配的案例。