Площадь-дерево, используя карты и рекурсии


Определить порядок сквер-дерево аналогично площадь-список порядок осуществления 2.21. То есть, площадь-список должен вести себя следующим образом:

(square-tree  (list 1
        (list 2 (list 3 4) 5)
        (list 6 7))) (1 (4 (9 16) 25) (36 49))

Определите площадь-дерево как непосредственно (т. е. без использования какого-либо высшего порядка процедур), а также используя карту и рекурсия.

Я написал это решение. Что вы думаете?

(define (square x) (* x x))

(define (square-tree tree)
  (cond ((null? tree) null)
        ((pair? tree)
         (cons (square-tree (car tree)) 
               (square-tree (cdr tree))))
        (else (square tree))))

(define (map-square-tree tree)
  (map (lambda (subtree)
         (if (pair? subtree)
             (cons (square-tree (car subtree))
                   (square-tree (cdr subtree)))
             (square subtree)))
       tree))

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

Редактировать: это гораздо лучшее решение на карте-квадрат-дерево.

(define (square x) (* x x))

(define (square-tree tree)
  (cond ((null? tree) null)
        ((pair? tree)
         (cons (square-tree (car tree)) 
               (square-tree (cdr tree))))
        (else (square tree))))

(define (map-square-tree tree)
  (map (lambda (subtree)
         ((if (pair? subtree) map-square-tree square) subtree))
       tree))

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


433
1
задан 8 апреля 2011 в 02:04 Источник Поделиться
Комментарии
1 ответ

Ваше прямое определение площади-дерево является правильным.

Определение с помощью карты звонки площадь-дерево; чтобы сделать его правильно рекурсивный вызов карте-квадрат-дерево вместо этого. Кроме того, вы можете обратиться на поддерево само себя. Это сделает ваш лаконичный код.

(define (map-square-tree tree)
(map (lambda (subtree)
((if (pair? subtree) map-square-tree square) subtree))
tree))

1
ответ дан 9 апреля 2011 в 08:04 Источник Поделиться