SICP练习1.6 1.16 解答

上一次看SICP没有做习题,这次就慢慢看,慢慢做题了。

效率比较低,很少抽空看看,这两个题不是一眼就看出结果的,所以写下。

 

1.6就是

cond和if有着同样的效果,为啥用cond实现的new-if不能用于一些函数。

答:因为new-if定义为函数,scheme的参数是使用的应用序规则,要先求出参数的值,所以再调用new-if的时候predicate the-clause else-clause都要求值,导致递归不能结束,然后stackoverflow。

 

1.16用迭代的方法实现fast-exp

球bn

我们设置一个变量a,让abn的值保持不变,初始a=1,那么在最后n=0的时候a的值就是bn

1)若n是偶数   a(b2)n/2

2)若n是奇数   (ab)bn-1

 

Common Lisp代码如下

(defun even? (x)
  (if (= (mod x 2) 0)
      T
      nil))
;;;求a^b
(defun fast-exp (a b)
  (defun exp-1957 (n m ans)
    (if (= m 0)
        ans
        (if (even? m)
            (exp-1957 (* n n) (/ m 2) ans)
            (exp-1957 n (- m 1) (* ans n)))))
  (exp-1957 a b 1))

你可能感兴趣的:(SICP)