lisp中循环列表的长度

时间:2014-06-09 12:05:40

标签: lisp common-lisp

来自'对lisp的简单介绍':

  

如果给出诸如#1 =(A B C。#1#)的循环列表作为输入,则LENGTH可以   根本不返回任何值。在大多数实现中,它将进入   无限循环。

这仍然是真的吗?是/是一个错误?为什么不首先检查列表的性质?

2 个答案:

答案 0 :(得分:7)

在像R7RS Scheme和Common Lisp这样的现代实现中,它们确实标识了循环列表,但为了减少开销,CL可能会挂起length并且list-length如果检测到圆则返回nil。

当你看到的只是一次一个缺点时,没有简单的方法可以看到列表的性质。你所做的是迭代一个变量中的每一步,而第二个元素中的每两步盯着第二个元素。如果这两个是同一个对象,则有一个圆参考。这称为the turtle and hare algorithm

答案 1 :(得分:4)

length一般用于处理序列;圆形度问题与列表相关,但不适用于字符串或数组。 list-length专门用于列表,并按正常列表的预期工作,但为循环列表返回nil