(Lispex)sicp.io
2.3 · 계층적 데이터

재귀는 데이터의 모양을 따라간다.

트리에서는 모든 노드에서 같은 질문을 합니다. 비어 있는지, 더 탐색할 순서쌍인지, 아니면 바꿀 잎인지 확인합니다.

생각해 볼 질문

하나의 프로시저가 트리의 모든 깊이에서 어떻게 동작할까요?

  • 잎과 가지 사례 구분하기
  • 트리의 모양을 유지하며 새 트리 만들기
  • 고정된 깊이 대신 구조적 재귀 사용하기

scale-tree는 층 수를 세지 않습니다. 순서쌍을 만나면 두 부분에 같은 프로시저를 적용하고 잎을 만나면 숫자 연산을 수행합니다.

제어 구조가 데이터 정의와 같은 모양을 가집니다. 그래서 얕은 리스트와 깊게 중첩된 트리를 깊이마다 따로 처리하지 않고 같은 프로시저로 다룰 수 있습니다.

리스펙스 · SICP 코드SICP에 필요한 Scheme 호환 문법을 리스펙스 SICP 프로필로 실행합니다.
(begin
  (define (scale-tree tree factor)
    (cond ((null? tree) '())
          ((pair? tree)
           (cons (scale-tree (car tree) factor)
                 (scale-tree (cdr tree) factor)))
          (else (* tree factor))))
  (scale-tree '(1 (2 (3 4) 5) (6 7)) 10))
리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 269 / 1,048,576바이트
예제
결과
출력
진단
보이는 실행 흐름0 / 0 개의 실행 이벤트
    이 브라우저 결과는 리스펙스 바우치나 권한이 아닙니다.wasm —
    예상 관찰

    첫 프로그램은 (10 (20 (30 40) 50) (60 70))을 반환합니다.

    실행 흐름에서 볼 점

    프로세스가 car와 cdr 두 갈래의 일로 나뉘는 지점을 찾아보세요. 마지막 중첩 구조는 이런 구조적 결정을 되풀이한 기록입니다. 이 실행 흐름은 한 번의 실행을 보는 제한된 학습 화면이며 리스펙스 바우치나 권한이 아닙니다.

    직접 해보기

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

    count-leaves를 정의하세요. 빈 리스트에서는 0, 순서쌍에서는 두 가지 결과의 합, 나머지 잎에서는 1을 반환하게 하세요.

    힌트 하나 보기

    scale-tree와 같은 세 가지 분류를 쓰되 잎에서 하는 연산만 바꾸세요.