]> git.rkrishnan.org Git - sicp.git/blobdiff - src/sicp/ex2_18.clj
solutions to 4.38, 4.39 and 4.40
[sicp.git] / src / sicp / ex2_18.clj
index b56c4e89b45ddc69eb529d0ba81d36e478b7fdc5..b74f723430e524729e3902fb53016807fdea11c8 100644 (file)
@@ -1,11 +1,12 @@
 (ns sicp.ex2_18
-  (:use [clojure test]))
+  (:use [clojure test])
+  (:refer-clojure :exclude (reverse)))
 
-(defn turn-around-1 [lst]
+(defn reverse-1 [lst]
   (reduce #(cons %2 %1) '() lst))
 
 
-(defn turn-around-2 [lst]
+(defn reverse-2 [lst]
   (let [reverse (fn [lst1 lst2]
                  (if (empty? lst1)
                    lst2
     (reverse lst '())))
 
 
-(deftest test-turn-around-1
+(defn reverse-3 [lst]
+  (if (empty? lst)
+    nil
+    (cons (last lst) (reverse-3 (butlast lst)))))
+
+(deftest test-reverse-1
   (are [x y] [= x y]
-       (turn-around-1 (list 1 2 3 4)) (list 4 3 2 1)
-       (turn-around-1 (list 1 4 9 16 25)) (list 25 16 9 4 1)))
+       (reverse-1 (list 1 2 3 4)) (list 4 3 2 1)
+       (reverse-1 (list 1 4 9 16 25)) (list 25 16 9 4 1)
+       (reverse-1 (list (list 1 2) (list 3 4))) (list (list 3 4) (list 1 2))))
 
-(deftest test-turn-around-2
+(deftest test-reverse-2
   (are [x y] [= x y]
-       (turn-around-2 (list 1 2 3 4)) (list 4 3 2 1)
-       (turn-around-2 (list 1 4 9 16 25)) (list 25 16 9 4 1)))
+       (reverse-2 (list 1 2 3 4)) (list 4 3 2 1)
+       (reverse-2 (list 1 4 9 16 25)) (list 25 16 9 4 1)
+       (reverse-1 (list (list 1 2) (list 3 4))) (list (list 3 4) (list 1 2))))