从"对lisp的温和介绍":
如果给出诸如#1 =(ABC.#1#)的循环列表作为输入,则LENGTH可能根本不返回值.在大多数实现中,它将进入无限循环.
这仍然是真的吗?是/是一个错误?为什么不首先检查列表的性质?
在像R7RS Scheme和Common Lisp这样的现代实现中,它们确实标识循环列表,但是为了减少开销,CL length可能会挂起并且list-length如果检测到圆则返回nil.
当你看到的只是一次一个缺点时,没有简单的方法来查看列表的性质.你所做的是迭代一个变量中的每一步,而第二个元素中的每两步盯着第二个元素.如果这两个是同一个对象,则有一个圆参考.这就是所谓的乌龟和野兔算法.