没有'appent'或'list'的顶层反向列表

时间:2015-10-25 19:47:41

标签: lisp racket

我做了一些可以反转简单列表的功能,比如(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输出:

enter image description here

1 个答案:

答案 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)匹配的案例。