]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex2_18.clj
solution to 4.43
[sicp.git] / src / sicp / ex2_18.clj
1 (ns sicp.ex2_18
2   (:use [clojure test])
3   (:refer-clojure :exclude (reverse)))
4
5 (defn reverse-1 [lst]
6   (reduce #(cons %2 %1) '() lst))
7
8
9 (defn reverse-2 [lst]
10   (let [reverse (fn [lst1 lst2]
11                   (if (empty? lst1)
12                     lst2
13                     (recur (rest lst1) (cons (first lst1) lst2))))]
14     (reverse lst '())))
15
16
17 (defn reverse-3 [lst]
18   (if (empty? lst)
19     nil
20     (cons (last lst) (reverse-3 (butlast lst)))))
21
22 (deftest test-reverse-1
23   (are [x y] [= x y]
24        (reverse-1 (list 1 2 3 4)) (list 4 3 2 1)
25        (reverse-1 (list 1 4 9 16 25)) (list 25 16 9 4 1)
26        (reverse-1 (list (list 1 2) (list 3 4))) (list (list 3 4) (list 1 2))))
27
28 (deftest test-reverse-2
29   (are [x y] [= x y]
30        (reverse-2 (list 1 2 3 4)) (list 4 3 2 1)
31        (reverse-2 (list 1 4 9 16 25)) (list 25 16 9 4 1)
32        (reverse-1 (list (list 1 2) (list 3 4))) (list (list 3 4) (list 1 2))))