一直在课堂上玩 LISP。这无疑是我编写的第一个 LISP 代码。我无法弄清楚为什么此代码会为"invocation stack history overflow"
函数的输入值超过 2000产生错误(longest_collatz n)
。有更多这门语言经验的人可以帮助我理解错误吗?
(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)))