(Lispex)sicp.io
2.8 · 구간 산술

선택자는 구간의 표현과 계산을 나눈다.

불확실한 양을 인터페이스 뒤의 아래 경곗값과 위 경곗값으로 나타내고 산술은 가능한 끝점 결과를 포함하는 새 구간을 만듭니다.

생각해 볼 질문

산술은 두 경곗값의 저장 방식에 기대지 않고 범위를 어떻게 사용할까요?

  • 아래 경곗값과 위 경곗값으로 구간 만들기
  • 순서쌍 표현을 bound 선택자 뒤에 두기
  • 구간 덧셈에서 경곗값 전파하기
  • 부호가 다를 때 끝점 곱 네 개 모두 비교하기

make-interval은 경곗값 두 개를 순서쌍에 저장하지만 add-interval과 mul-interval은 그 순서쌍을 직접 들여다보지 않습니다. 앞에서 유리수에 사용한 것과 같은 추상화 장벽을 유지하며 lower-bound와 upper-bound에게 항목을 요청합니다.

덧셈은 두 아래 경곗값과 두 위 경곗값을 각각 더합니다. 곱셈은 구간이 0을 지날 때 가장 작거나 큰 결과가 다른 끝점 조합에서 나올 수 있으므로 네 끝점 곱을 모두 비교해야 합니다. 결과는 독립적인 경곗값 안의 가능한 곱을 포함하며 확률 모형이 아닙니다.

리스펙스 · SICP 코드SICP에 필요한 Scheme 호환 문법을 리스펙스 SICP 프로필로 실행합니다.
(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 개의 실행 이벤트
    이 브라우저 결과는 리스펙스 바우치나 권한이 아닙니다.wasm —
    예상 관찰

    첫 프로그램은 (4 7)을 반환합니다. 두 번째 프로그램은 (-10 15)를 반환합니다.

    실행 흐름에서 볼 점

    각 선택자 호출이 표현 장벽을 지나는 과정을 따라가세요. 곱셈에서는 min4와 max4가 반환할 경계를 고르기 전에 -8과 -10과 12와 15 네 곱을 모두 찾으세요. 제한된 실행 흐름은 선택한 구간만 설명하며 리스펙스 바우치나 권한이 아닙니다.

    직접 해보기

    힌트를 보기 전에 프로그램을 바꿔 보세요.

    두 번째 구간을 (4, 5)에서 (-5, -4)로 바꾸세요. 실행하기 전에 네 끝점 곱과 결과의 아래 및 위 경곗값을 모두 예상해 보세요.

    힌트 하나 보기

    첫 곱이 아래 경곗값이라고 가정하지 마세요. 끝점을 곱한 네 값을 모두 비교하세요.