결과값은 마지막 장면일 뿐이다.
두 프로시저가 같은 수학 함수를 계산하더라도 서로 아주 다른 계산 프로세스를 만들 수 있습니다.
생각해 볼 질문
재귀적 프로세스와 반복적 프로세스는 무엇이 다를까요?
- 재귀 문법과 재귀적 프로세스의 성장을 구분하기
- 반복적 프로세스가 명시적으로 들고 다니는 상태 알아보기
- 제한된 실행 흐름으로 프로세스의 모양 살펴보기
재귀적 프로세스 방식은 더 작은 factorial 계산이 돌아올 때까지 곱셈을 미룹니다. 나중에 해야 할 일이 n에 따라 늘어납니다. 반복적 프로세스 방식은 지금까지의 곱과 카운터를 완전한 상태로 들고 다음 호출로 갑니다.
두 정의 모두 자기 자신을 호출하므로 재귀 프로시저입니다. 하지만 두 번째 정의만 고정된 개수의 상태 변수로 요약할 수 있는 반복적 프로세스를 만듭니다.
(letrec ((factorial
(lambda (n product)
(if (= n 0)
product
(factorial (- n 1) (* n product))))))
(factorial 8 1))리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 170 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
보이는 실행 흐름0 / 0 개의 실행 이벤트
두 프로그램 모두 40320을 반환합니다.
호출과 곱셈이 나타나는 순서를 비교하세요. 이 제한된 실행 흐름은 이번 실행을 살펴보는 학습 화면일 뿐이며 모든 입력의 자원 사용을 증명하거나 리스펙스 바우치나 권한을 만들지 않습니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
두 예제를 5로 실행하세요. 반복적 프로세스 버전에서는 각 호출 직전의 n과 product를 적어 보세요.
힌트 하나 보기
매 단계에서 product와 n factorial을 곱한 값은 처음 풀려던 factorial 값과 같습니다.