Решение упражнения 2.35 из SICP

30 January, 2008 (21:38) | Решения упражнений

Чрезвычайно приятное упражнение. Определение 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