上一次看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))