달라지는 부분을 인수로 넘긴다.
고차 프로시저는 계산의 공통된 모양을 담아 두고 달라지는 연산을 인수로 받습니다.
생각해 볼 질문
하나의 프로시저로 여러 종류의 합을 어떻게 나타낼 수 있을까요?
- 프로시저를 보통 값처럼 다루기
- 여러 합에서 바뀌지 않는 계산 구조 찾기
- term과 next를 통해 달라지는 동작 전달하기
sum은 정수, 제곱, 또는 다른 수열 가운데 무엇을 더하는지 미리 알지 못합니다. term은 더할 값을 고르고 next는 다음 지점을 고릅니다. 재귀 호출은 모든 합에 공통된 순회 구조만 맡습니다.
이 분리는 중요한 설계 습관의 시작입니다. 바뀌지 않는 프로세스에는 한 번 이름을 붙이고 달라지는 결정은 인수로 넘깁니다.
(begin
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
(define (identity x) x)
(define (inc x) (+ x 1))
(sum identity 1 inc 10))리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 192 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
보이는 실행 흐름0 / 0 개의 실행 이벤트
첫 프로그램은 55를 반환합니다. 두 번째 프로그램도 55를 반환합니다.
각 단계에서 term과 next를 찾아 적용하는 부분을 살펴보세요. 프로시저 값도 숫자 값과 마찬가지로 같은 평가기를 거칩니다. 이 실행 흐름은 한 번의 실행을 보는 제한된 학습 화면이며 리스펙스 바우치나 권한이 아닙니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
term으로 쓸 double 프로시저와 next로 쓸 step-two 프로시저를 정의하세요. sum을 사용해 1부터 9까지 홀수를 두 배 한 값을 모두 더하세요.
힌트 하나 보기
next가 값을 건너뛰더라도 순회가 끝나는 경계는 그대로입니다.