본문 바로가기

LISP?

[학습] 팩토리얼 구하기

;;; Recursion VS. Iteration
;;; 재귀냐 반복이냐

;;; case 1 선형 재귀 프로세스
;;; Linear recursive process
;;; 곧바로 연산을 하지 않고 자꾸 미루어 놓은 탓에 식이 옆으로 늘어났다가
;;; 곱셈 연산을 하면서 줄어드는 shape
;;; 일정 범위 동안 값을 쥐고 있어야 하므로 stack이라는 데이터 구조가 필요하다.

(defun factorial (n)
 (if (= n 1) 1 (* n (factorial (- n 1)))))
 
(factorial 5)
;;;====> 120


;;; case 2 선형 반복 프로세스
;;; linear iterative process
;;; 프로세스가 늘거나 줄지 않는 shape
;;; 상태변수가 있어서 반복할 때마다 바뀌는 계산 상태를 간추려서 기록해 두고
;;; 계산 단계가 넘어갈 때마다 상태변수 값을 고쳐 쓰는 규칙이 있으며
;;; 계산을 끝낼 조건을 따지는 마무리 검사 과정도 있다.

(defun factorial (n)
                  (defun iter (product counter)
                    (if (> counter n) product (iter (* product counter) (+ counter 1))))
                  (iter 1 1))
                 
(factorial 100)
;;;======>93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000               


;;; 되도는 프로시저를 통해서도 충분히 반복하는 프로세스를 구현할 수 있다.
;;; tail-recursion