当我试图执行以下递归函数时,clisp中会出现'-Program stack overflow'提示,我相信该函数返回列表中最常见的元素:

(defun greater-member (lst)
  (cond  ((null (cdr lst))
                (cons (car lst) (count-if #'(lambda (x) (eql x (car lst))) lst)))
         ((>= (count-if #'(lambda (x) (eql x (car lst))) lst)
              (count-if #'(lambda (x) (eql x (car (remove (car lst) lst)))) lst))
                (greater-member (remove (car (remove (car lst) lst)) lst)))
         (t (greater-member (remove (car lst) lst)))))

例如,较大的数字应返回如下:
>(greater-number '(a a a b b b b c))
(b . 4)

我可以问一下,是什么导致了溢出我已经排除了所有的语法错误
通过在clisp中重复执行更大的数字,函数似乎在逻辑上保持不变。

最佳答案

我现在意识到我的错误了。
看我的空测试,而不是

(null (cdr lst))

我应该有
(null (remove (car lst) lst))

这样,多余的、较少出现的唯一元素就被删除了。

关于recursion - 执行递归Lisp函数时堆栈溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12670616/

10-16 04:28