SICP 연습문제 1.30 친절한 풀이

문제

위에서 짠 sum 프로시저는 선형 재귀 프로세스를 만들어 낸다. 이를 다음처럼 선형으로 반복하게끔 고칠 수 있다. 빈 곳을 채워 보라.

(define (sum term a next b)
(define (iter a result)
(if <??>
<??>
(iter <??> <??>)))
(iter <??> <??>))

문제로 부터 얻은 것

되도는 프로세스를 반복하는 프로세스로 고치려면
결과값을 저장할 인자 하나를 상정하는 것이 좋습니다.

문제풀이

앞의 연습문제들에서 반복하는 프로세스를 많이 만들어 봤으므로, 어떻게 해야 하는 지는 본능적으로 떠올랐습니다.

바로 result에 모든 결과를 축적하면서 반복을 진행하는 것입니다.

if식의 술어인 반복 탈출 조건은 당연히 a>ba>b입니다.
next 프로시저에 따라 정확하게 a=ba=b가 나오지 않을 수 있기 때문입니다.
그리고 탈출 조건을 만족할 때에 지금까지 값을 축적한 result를 반환해야 하므로 if식의 참일때 결과는 result입니다.

(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter <??> <??>)))
(iter <??> <??>))





아직 a>ba>b가 아니라면,
(term a)값을 result에 축적하고
(next a)를 iter 프로시저에 넘겨줘야 합니다.

(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ result (term a)))))
(iter <??> <??>))





sum 프로시저의 시작 iter에는 당연히 a의 초기값과 result를 축적할 0이 들어가야 합니다.

(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ result (term a)))))
(iter a 0))





시험삼아 아래의 코드를 실행시켜 보겠습니다.

(define (square x)
(* x x))

(define (inc x)
(+ x 1))

(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ result (term a)))))
(iter a 0))

(sum square 1 inc 5)

12+22+32+42+52=551^2+2^2+3^2+4^2+5^2=55

정상적으로 작동하는 sum 프로시저





읽어주셔서 감사합니다.