小编Mat*_*uet的帖子

Common Lisp - 编写一个检测循环列表的函数

我有一个CS功能语言类的作业,我们必须编写一个能够检测给定列表在其开头是否为循环的函数.该函数必须是递归的.我们来命名它circular:

* (setf list1 '(a b c d))
* (rplacd (cddr list1) list1)
* list1
#1=(A B C . #1#)
* (circular list1)
t
* (circular '(a b c a b c))
nil
Run Code Online (Sandbox Code Playgroud)

现在,我知道在这种情况下如何检查圆度:在递归的某个点上,列表中的原子 a cons将与列表本身共享相同的地址,因此是圆形度.到目前为止,这是我的功能:

(defun circular (list &aux list2)
  (setf list2 list)
  (cond
    ((null list) nil)
    ((eq (car list) list2) t)
    (t (circular (cdr list))) ) )
Run Code Online (Sandbox Code Playgroud)

我认为通过比较递归的每个点carlist反对list2,函数最终会返回一个结果,但是当函数对非循环列表起作用时,当我尝试在循环列表中使用它时,它会变得无限递归.我确信我错过了一些非常明显的东西,但是,任何帮助都会非常感激!

lisp recursion function list common-lisp

4
推荐指数
1
解决办法
402
查看次数

标签 统计

common-lisp ×1

function ×1

lisp ×1

list ×1

recursion ×1