재귀는 데이터의 모양을 따라간다.
트리에서는 모든 노드에서 같은 질문을 합니다. 비어 있는지, 더 탐색할 순서쌍인지, 아니면 바꿀 잎인지 확인합니다.
생각해 볼 질문
하나의 프로시저가 트리의 모든 깊이에서 어떻게 동작할까요?
- 잎과 가지 사례 구분하기
- 트리의 모양을 유지하며 새 트리 만들기
- 고정된 깊이 대신 구조적 재귀 사용하기
scale-tree는 층 수를 세지 않습니다. 순서쌍을 만나면 두 부분에 같은 프로시저를 적용하고 잎을 만나면 숫자 연산을 수행합니다.
제어 구조가 데이터 정의와 같은 모양을 가집니다. 그래서 얕은 리스트와 깊게 중첩된 트리를 깊이마다 따로 처리하지 않고 같은 프로시저로 다룰 수 있습니다.
(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 개의 실행 이벤트
첫 프로그램은 (10 (20 (30 40) 50) (60 70))을 반환합니다.
프로세스가 car와 cdr 두 갈래의 일로 나뉘는 지점을 찾아보세요. 마지막 중첩 구조는 이런 구조적 결정을 되풀이한 기록입니다. 이 실행 흐름은 한 번의 실행을 보는 제한된 학습 화면이며 리스펙스 바우치나 권한이 아닙니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
count-leaves를 정의하세요. 빈 리스트에서는 0, 순서쌍에서는 두 가지 결과의 합, 나머지 잎에서는 1을 반환하게 하세요.
힌트 하나 보기
scale-tree와 같은 세 가지 분류를 쓰되 잎에서 하는 연산만 바꾸세요.