没有 '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).

的案例