(Lispex)sicp.io
1.7 · 정의 하나와 프로세스 두 개

유한 연분수는 펼칠 수도 누적할 수도 있다.

같은 분자 프로시저와 분모 프로시저로 첫 항부터 펼치는 재귀적 프로세스와 마지막 항부터 쌓는 반복적 프로세스를 만들 수 있습니다.

생각해 볼 질문

평가 순서는 유한 연분수 값을 바꾸지 않으면서 프로세스의 모양을 어떻게 바꿀까요?

  • 분자 프로시저와 분모 프로시저로 유한 연분수 나타내기
  • 위에서 아래로 펼치는 재귀에서 미뤄지는 나눗셈 읽기
  • 아래에서 위로 쌓는 반복에서 완성된 누적 결과 읽기
  • 깊이와 각 항을 고정한 채 프로세스 모양 비교하기

재귀 버전은 1번 항에서 시작하지만 나머지 연분수가 돌아오기 전에는 나눗셈을 끝낼 수 없습니다. recur가 k를 향해 가는 동안 호출마다 분모 덧셈과 나눗셈 하나가 기다립니다.

반복 버전은 k번 항에서 시작하며 0.0을 이미 계산한 꼬리로 둡니다. 호출마다 result를 완성된 연분수 층 하나로 바꾸고 1번 항을 향해 갑니다. 두 예제는 분자와 분모 열 개가 모두 1.0이므로 황금비의 역수에 대한 같은 유한 근삿값을 반환합니다.

리스펙스 · SICP 코드SICP에 필요한 Scheme 호환 문법을 리스펙스 SICP 프로필로 실행합니다.
(begin
  (define (cont-frac numerator denominator k)
    (define (recur i)
      (if (> i k)
          0.0
          (/ (numerator i)
             (+ (denominator i) (recur (+ i 1))))))
    (recur 1))
  (cont-frac (lambda (i) 1.0)
             (lambda (i) 1.0)
             10))
리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 278 / 1,048,576바이트
예제
결과
출력
진단
보이는 실행 흐름0 / 0 개의 실행 이벤트
    이 브라우저 결과는 리스펙스 바우치나 권한이 아닙니다.wasm —
    예상 관찰

    두 프로그램은 항 열 개에서 모두 0.6179775280898876을 반환합니다.

    실행 흐름에서 볼 점

    재귀 실행에서는 나눗셈이 돌아오기 전에 recur가 k를 향해 가는 과정을 따라가세요. 반복 실행에서는 i가 줄어들 때마다 result가 완성된 꼬리 하나로 바뀌는 모습을 보세요. 이 제한된 실행 흐름은 고정된 이번 깊이와 항만 설명하며 리스펙스 바우치나 권한이 아닙니다.

    직접 해보기

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

    두 프로그램에서 k를 10에서 5로 바꾸세요. 두 결과가 여전히 같은지 예상하고 새로운 유한 값을 기록해 보세요.

    힌트 하나 보기

    분자와 분모는 그대로 두세요. 연분수 층의 수만 줄어듭니다.