선택자는 구간의 표현과 계산을 나눈다.
불확실한 양을 인터페이스 뒤의 아래 경곗값과 위 경곗값으로 나타내고 산술은 가능한 끝점 결과를 포함하는 새 구간을 만듭니다.
생각해 볼 질문
산술은 두 경곗값의 저장 방식에 기대지 않고 범위를 어떻게 사용할까요?
- 아래 경곗값과 위 경곗값으로 구간 만들기
- 순서쌍 표현을 bound 선택자 뒤에 두기
- 구간 덧셈에서 경곗값 전파하기
- 부호가 다를 때 끝점 곱 네 개 모두 비교하기
make-interval은 경곗값 두 개를 순서쌍에 저장하지만 add-interval과 mul-interval은 그 순서쌍을 직접 들여다보지 않습니다. 앞에서 유리수에 사용한 것과 같은 추상화 장벽을 유지하며 lower-bound와 upper-bound에게 항목을 요청합니다.
덧셈은 두 아래 경곗값과 두 위 경곗값을 각각 더합니다. 곱셈은 구간이 0을 지날 때 가장 작거나 큰 결과가 다른 끝점 조합에서 나올 수 있으므로 네 끝점 곱을 모두 비교해야 합니다. 결과는 독립적인 경곗값 안의 가능한 곱을 포함하며 확률 모형이 아닙니다.
(begin
(define (make-interval lower upper) (cons lower upper))
(define (lower-bound interval) (car interval))
(define (upper-bound interval) (cdr interval))
(define (add-interval left right)
(make-interval
(+ (lower-bound left) (lower-bound right))
(+ (upper-bound left) (upper-bound right))))
(define total
(add-interval (make-interval 1 2)
(make-interval 3 5)))
(list (lower-bound total) (upper-bound total)))리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 461 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
보이는 실행 흐름0 / 0 개의 실행 이벤트
첫 프로그램은 (4 7)을 반환합니다. 두 번째 프로그램은 (-10 15)를 반환합니다.
각 선택자 호출이 표현 장벽을 지나는 과정을 따라가세요. 곱셈에서는 min4와 max4가 반환할 경계를 고르기 전에 -8과 -10과 12와 15 네 곱을 모두 찾으세요. 제한된 실행 흐름은 선택한 구간만 설명하며 리스펙스 바우치나 권한이 아닙니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
두 번째 구간을 (4, 5)에서 (-5, -4)로 바꾸세요. 실행하기 전에 네 끝점 곱과 결과의 아래 및 위 경곗값을 모두 예상해 보세요.
힌트 하나 보기
첫 곱이 아래 경곗값이라고 가정하지 마세요. 끝점을 곱한 네 값을 모두 비교하세요.