在課堂上玩過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)))
它似乎並不適合我。 '(longest_collatz 3000)'返回'(217 2919)'在'SBCL 1.1.11'上。你使用的是什麼實現和版本?一般來說,Common Lisp不保證tail-call消除,所以我認爲你的'maxlist'會成爲大輸入的問題。 – Inaimathi
你能告訴我們你的功能應該做什麼嗎?描述每一個。顯示輸入和輸出。 – ooga