클래스에서 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)는 테일 콜 제거 (tail-call elimination)를 보장하지 않으므로 더 큰 입력에 대해서는 '최대 목록 (maxlist)'이 문제라고 생각합니다. – Inaimathi
기능이 무엇을해야하는지 알려주십시오. 각각을 설명하십시오. 입력과 출력을 보여줍니다. – ooga