]> git.rkrishnan.org Git - sicp.git/commitdiff
solution to 2.22
authorRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Thu, 1 Jul 2010 03:40:30 +0000 (09:10 +0530)
committerRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Thu, 1 Jul 2010 03:40:30 +0000 (09:10 +0530)
src/sicp/ex2_22.clj [new file with mode: 0644]

diff --git a/src/sicp/ex2_22.clj b/src/sicp/ex2_22.clj
new file mode 100644 (file)
index 0000000..349b889
--- /dev/null
@@ -0,0 +1,38 @@
+(ns sicp.ex2_22
+  (:use [sicp [utils :only (square)]]
+       [clojure test]))
+
+(defn square-list-1 [items]
+  (let [f (fn [things answer]
+           (if (empty? things)
+             answer
+             (recur (rest things) 
+                    (cons (square (first things))
+                          answer))))]
+    (f items nil)))
+
+(comment
+  "This produced reversed list, as we cons into an empty list and
+   consing into a list always adds elements into the head as this
+   is the most efficient - O(1) - way to add elements into the list."
+)
+
+(deftest test-square-list
+  (is (= (square-list-1 '(1 2 3 4)) '(16 9 4 1))))
+
+;; Louis then tries to fix his bug by interchanging the arguments to cons:
+
+(defn square-list-2 [items]
+  (let [f (fn [things answer]
+           (if (empty? things)
+             answer
+             (recur (rest things)
+                    (cons answer
+                          (square (first things))))))]
+    (f items nil)))
+
+(comment
+  "This won't work because a 'nil' in the cons cell represents the
+   end of the list and cons is used to construct a list by appending
+   elements at the head of the list and not by appending at the tail."
+)
\ No newline at end of file