久拖未决的习题1.17终于来了。这拖的好久。我都快忘记语法规则了。
话不多说,先看题目要求
题目要点,使用对数步骤计算出结果。简单来看,跟上一道题目,在结构上是相同的。因此,采用复制修改代码的套路。这里特别说明一点 ,mydouble 是因为double在clojure里面已经存在,是定义为double类型的含义,所以改用这个名字。
(defn mydouble [a]
(+ a a)
)
(defn halve [a]
(if (even? a)
(/ a 2)
0
)
)
(defn fast-multip-iter [a b r]
(cond (= b 0) r
(even? b) (fast-multip-iter (mydouble a) (halve b) r)
:else (+ a (fast-multip-iter (mydouble a) (halve (- b 1)) r))
)
)
(defn fast-multip [a b]
(fast-multip-iter a b 0)
)
执行结果如下图
负数的情况,支持的还是不太好,结果如下