Решение упражнения 2.35 из SICP
Чрезвычайно приятное упражнение. Определение count-leaves с помощью накопления выглядит следующим образом:
(define (count-leaves t) (accumulate + 0 (map (lambda (x) (if (pair? x) (count-leaves x) 1)) t)))
Смысл определения заключается в том, что мы вычисляем число листьев в дереве, суммируя числа листьев в каждом из его поддеревьев. Количество листьев в поддереве вычисляется либо рекурсивным вызовом самой процедуры count-leaves, если поддерево не является листом, либо равно 1, если поддерево – это лист.
Comments
Comment from anonymous
Date: November 30, 2010, 2:02 pm
Вариант без map:
(define (count-leaves t)
(accumulate (λ(x y)
(+ y
(if (pair? x)
(count-leaves x)
1)))
0
t))
Comment from anonymous
Date: November 30, 2010, 2:02 pm
(define (count-leaves t)
(accumulate (λ(x y)
(+ y
(if (pair? x)
(count-leaves x)
1)))
0
t))
Comment from Sergk
Date: February 24, 2015, 9:34 pm
(define (count-leaves t)
(accumulate + 0 (map (lambda (x) (/ x x)) (enumerate-tree t)))) ; enumerate-tree – преобразует дерево в список
Write a comment