2017-10-20 13 views
1

이 함수는 약 2000 단계 이상의 스택 오버 플로우를 초래합니다. 메모리를 적게 사용하도록 쉽게 최적화 할 수있는 방법이 있습니까? 난 당신이 내가 가지고 사용하는 기능을 가지고 있지 않기 때문에Lisp 재귀 적 랜덤 워크 최적화

(defun randomwalk (steps state) 
    (loop :if (= steps 0)  
      :do (return nil) 
     :if (solved? state) 
      :do (return t) 
     :else 
      :do (let* ((nrmlstate (normalize state)) 
         (moves (getallmoves nrmlstate)) 
         (random-move (nth (random (length moves)) moves))) 
        (setf state (applymove nrmlstate random-move)) 
        (decf steps)))) 

을 : 당신은 당신이 쉽게 모든 재귀하지를 다시 작성할 수 있습니다 의미 꼬리 위치에 전화처럼

(defun randomwalk (steps state) 
(displaystate state) 
(if (equal steps 0) nil 
     (if (solved? state) t 
      (let ((nrmlstate (normalize state))) 
       (randomwalk (- steps 1) (applymove nrmlstate (nth (random 
(length (getallmoves nrmlstate))) (getallmoves nrmlstate)))) 
      ) 
     ) 
    ) 
) 
+1

더 나은 코드 형식 및 재현 가능한 테스트 사례로 질문을 개선하고 싶을 수 있습니다. 이 Stackoverflow 도움말을 참조하십시오 : https://stackoverflow.com/help/mcve –

+0

Rainer가 말했듯이 코드의 형식이 너무 나빠서 어떻게되는지 알지 못하기 때문에 (테스트 사례가 없어도 도움이되지 않습니다) 그러나이 함수를 컴파일하는 대부분의 구현 (그러나 언어로 보장되지는 않음)에서는 스택을 소비하지 않는 프로세스가 필요합니다. (어떤 구현은 심지어 컴파일 단계가 필요하지 않을 수도 있습니다.) – tfb

답변

2

은 같습니다 기본 케이스가 아닌 다른 테스트를 할 수 없었습니다.

+0

나는 그것을 순전히 기능적으로 유지하기를 바랬지 만 이것이 효과적입니다! 나는 gnu clisp에 붙어 있고, 가능한 한 메모리 제한을 높이거나 clisp do tail 재귀 최적화를 할 수있는 방법이 없다. –

+0

@RossGriebenow @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 있습니다. 휴대용 응용 프로그램에서. 따라서 CL에서 함수형 프로그래밍을 수행하는 관용적 인 방법은 선형 업데이트입니다. 이 방법은 인터페이스가 작동하는 한 내부적으로 변경하는 것이 좋습니다. – Sylwester

+0

@RossGriebenow BTW 스택 크기를 늘리는 것은 시스템에 따라 다르지만, CLISP FAQ에는 [재사용을 위해 스택을 늘리는 유닉스와 윈도우] (https://clisp.sourceforge.io/impnotes/faq.html#faqstack)가 있습니다. 컴파일하거나 다시 작성할 수 없습니다. – Sylwester