SICP 거듭제곱

SICP 2024. 5. 27. 00:46

재귀적 정의

b^n = b * b ^ (n-1)

b^0 = 1

거듭제곱의 재귀적 정의를 함수로 구현하면 다음과 같다.

function expt(b, n) {
	return n === 0
	: 1
	? b * expt(b, n - 1);
}

위 함수는 선형 재귀적 과정으로 구현한 것이고, 반복적 과정으로 변경한 것은 아래와 같다.

function expt(b, n) {
	return expt_iter(b, n, 1);
}

function expt_iter(b, counter, product) {
	return counter === 0
	: product
	? expt_iter(b, n - 1, product * b);
}

하지만 여기서, 연속제곱을 이용하면 거듭제곱에 필요한 단계 수를 줄일 수 있고, 다음과 같이 정의된다.

b^n = (b^n/2)^2 → n이 짝수

b^n = b * b^(n -1) → n이 홀수

function fast_expt(b, n) {
	return n === 0
	: 1
	? is_even(n)
	: square(fast_expt(b, n / 2))
	? b * fast_expt(b, n - 1);
}

 

'SICP' 카테고리의 다른 글

잔돈 만들기  (0) 2025.02.12
SICP 트리 재귀  (0) 2024.05.26
SICP 문제 1.9  (0) 2024.05.25
SICP: 반복과 재귀  (0) 2024.05.22
SICP: 1장 2 함수와 과정  (0) 2024.05.22