【发布时间】:2014-05-25 21:03:06
【问题描述】:
一直在课堂上玩 LISP。这无疑是我编写的第一个 LISP 代码。我无法弄清楚为什么对于函数(longest_collatz n) 的输入值超过 2000 时,此代码会产生错误"invocation stack history overflow"。有更多这门语言经验的人可以帮助我理解错误吗?
(defun longest_collatz(n)
(reverse
(maxlist
(loop for x from 1 to n
collect (list x (length (collatz x)))))))
(defun collatz (n)
(if (<= n 1)
'(1)
(if (= (mod n 2) 0)
(cons (/ n 2) (collatz (/ n 2)))
(cons (+ (* n 3) 1) (collatz (+ (* n 3) 1))))))
(defun maxlist (z)
(if (> (length z) 1)
(if (< (cadr (elt z 0)) (cadr (elt z 1)))
(maxlist (cdr z))
(maxlist (cons (elt z 0) (cddr z))))
(car z)))
【问题讨论】:
-
这似乎不适合我。
(longest_collatz 3000)在SBCL 1.1.11上返回(217 2919)。您使用的是什么实现和版本?一般来说,Common Lisp 不能保证消除尾调用,所以我认为您的maxlist将是较大输入的问题。 -
您能告诉我们您的功能应该做什么吗?逐一描述。显示输入和输出。
标签: stack lisp stack-overflow history invocation