summaryrefslogtreecommitdiff
path: root/coding-exercises/2/30.rkt
blob: 785a8dcfc0e144e9a89d7af307bd1504a44aaad0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#lang racket
(define (scale-tree tree factor)
  (cond ((null? tree) nil)
        ((not (pair? tree)) (* tree factor))
        (else (cons (scale-tree (car tree) factor)
                    (scale-tree (cdr tree) factor)))))

(define (scale-tree tree factor)
  (map (lambda (sub-tree)
         (if (pair? sub-tree)
           (scale-tree subtree factor)
           (* sub-tree factor)))
       tree))

;; analogous to, but we now also have to test when to recurse in the middle of the tree
;; (define (square-list items)
;;   (if (null? items)
;;     (list)
;;     (cons (square (car items)) (square-list (cdr items)))))
(define (square-tree tree)
  (cond ((null? tree) nil)
        ((not (pair? tree)) (* tree tree))
        (else (cons (square-tree (car tree))
                    (square-tree (cdr tree))))))

(define test-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
((lambda ()
   (display (square-tree test-tree))))

;; Can I also pass some state combining sequence and recursive operations?
(define (square-tree-map tree)
  (map (lambda (subtree)
         (if (pair? subtree)
           (square-tree-map subtree)
           (* subtree subtree)))
       tree))
((lambda ()
   (display (square-tree-map test-tree))))