Пересмотреть счет-листья по мере накопления


Упражнения 2.35. Пересмотреть счет-листья в разделе 2.2.2 по мере накопления:

(define (count-leaves t) (accumulate <??> <??> (map <??> <??>)))

Я написал следующее:

(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))

(define (count-leaves t)
  (accumulate +
              0
              (map (lambda (subtree)
                     (if (pair? subtree) 
                         (count-leaves subtree)
                         1))
                   t)))

(define a (list 1 2 (list 1) (list 1 2 (list 2 (list 1 2)))))

Что вы думаете?



530
6
задан 11 апреля 2011 в 03:04 Источник Поделиться
Комментарии
1 ответ

Код не обрабатывает случай только один лист, т. е.

 (count-leaves 'leaf)

но я предполагаю, что это побочный эффект от первоначальной формулировке проблемы. Уборщик решением будет

(define (count-leaves t)
(if (pair? t)
(accumulate + 0 (map count-leaves t))
1)))

и потому, что он короче, но это не вписывается в картину оригинальных упражнений.

Кстати, в этом случае процедура стандартная схема применения будет достаточно, потому что схема + рутинную принимает произвольное число аргументов, и вы могли бы написать просто:

(define (count-leaves t)
(if (pair? t)
(apply + (map count-leaves t))
1)))

2
ответ дан 15 апреля 2011 в 01:04 Источник Поделиться