| |
| | (ns e2-30-31-32
(:use clojure.test)
(:use [clojure.contrib.generic.math-functions :only (sqr)]))
| | (defn leaf? [t]
(not (sequential? t)))
| | (defn square-tree [t]
(map (fn [sub-t]
(if (leaf? sub-t) (* sub-t sub-t)
(square-tree sub-t)))
t))
| | (defn square-tree-look-ma-no-map [t]
(if (empty? t) nil
(if (leaf? (first t))
(cons (* (first t) (first t)) (square-tree-look-ma-no-map (rest t)))
; Firstly I wrote (list) instead of (cons). Had to scracth my head about that.
(cons (square-tree-look-ma-no-map (first t)) (square-tree-look-ma-no-map (rest t))))))
| | (def *test-list* [1 [2 [3 4] 5] [6 7]])
(def *test-result* [1 [4 [9 16] 25] [36 49]])
| | (deftest test-square-tree
(is (= (square-tree *test-list*) *test-result*))
(is (= (square-tree-look-ma-no-map *test-list*) *test-result*)))
| | (defn tree-map [f t]
(map (fn [sub-t]
(if (leaf? sub-t) (f sub-t)
(tree-map f sub-t)))
t))
| | (defn square-tree-with-map [t]
(tree-map sqr t))
| | (deftest test-square-tree-with-map
(is (= (square-tree-with-map *test-list*) *test-result*)))
We need to fill the function definition for the function which will map over the tail of the list.
| | (defn subsets [xs]
(if (empty? xs)
; We can't use [] instead of [[]] as (map f []) exexutes f zero times while (map f [[]]) executes (f []) once
[[]]
; 1. For the xs with length = 1, remaining will hold a set containing an empty set - [[]]
; which is a starting point for the accumulation.
(let [remaining (subsets (rest xs))]
; 2. Then, during each step the 'remaining' set of sets will be joined with another set.
; The other set is the same 'remaining' set of sets where each inner set is prefixed
; by a value from the original set 'xs'.
; Each recursive call to the (subsets) shrinks the original 'xs' set by one, so that
; the prefix is the n-th element of the 'xs' where 'n' is the nesting of the recursion.
(concat remaining
(map (fn [x]
(if (empty? x)
; We don't want empty lists (acquired at the beginning of the (subsets)) messing up our results
(list (first xs))
; here we join a value from the original set and a list of subsets accumulated so far
(cons (first xs) x)))
remaining)))))
| | (deftest test-subsets
(is (= (subsets [1 2 3])
[[] [3] [2] [2 3] [1] [1 3] [1 2] [1 2 3]])))
| |