练习1.10-练习1.17

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2014/01/07/2014-01-07-练习1.10-练习1.17/

访问原文「练习1.10-练习1.17

1.练习1.10
这个是阿克曼函数,真的很牛,花了我很长时间。
表达式的求值就不说了。
(define (f n) (A 0 n)) ——-2n
(define (g n) (A 1 n))——-2的n次方
(define (h n) (A 2 n))——-n个2的次方,例如:(h 4)表示为2的2次方的2次方的2次方
2.练习1.11
递归计算过程:

1
2
3
4
5
6
(define (f1 n)
(if (< n 3)
n
(+ (f1 (- n 1))
(* 2 (f1 (- n 2)))
(* 3 (f1 (- n 3))))))

迭代计算过程:

1
2
3
4
5
6
7
8
9
10
(define (f2 n)
(f2-iter 2 1 0 3 n))
(define (f2-iter a b c num n)
(cond ((< n 3) n)
((> num n) a)
(else (f2-iter (+ a
(* 2 b)
(* 3 c))
a b (+ num 1) n))))

解释一下迭代计算过程吧,利用a b c 三个数字保存临时的数据,num表示目前计算的状态,当num>n时,表示已经求得的结果在a中。
下面的结果是别人的例子,不是有多好,只是给我很大的启发,参数的移动可以增强程序的灵活性,不错!!我得记住这一点。。。

1
2
3
4
5
6
7
8
(define (myf-iter a b c n)
(format #t "Caculating n, n is ~S, a is ~S, b is ~S, c is ~S ~%" n a b c)
(if (= n 0)
a
(myf-iter b c ( + (* 3 a) (* 2 b) c) (- n 1))))
(define (newf n)
(myf-iter 0 1 2 n))

3.练习1.12

1
2
3
4
5
(define (yanghui row col)
(cond ((> col row) -1)
((or (= 1 col) (= row col)) 1)
(else (+ (yanghui (- row 1) (- col 1))
(yanghui (- row 1) col)))))

row表示第几行,col表示第row行的第几个数数字。当col为row行的第1个或者最后一个数的时候,结果为1;否则,结果为row-1行的col-1的数加上row-1行的col的数。4.练习1.13
不知道证明的对不对,对0和1的求值略去。
假设在n-1和n时,满足方程,代入n+1的方程 Φn +Φn -1=Φn +1,接着证明(Υn+Υn-1)/根5小于0.5,上式可变为Υn-1(Υ+1)/根5,可知Υn-1/根5小于0.5,而(Υ+1)/根5明显小于1,所以这个式子小于0.5,所以根据数学归纳法。。。
5.练习1.14
2的11次?
6.练习1.15
都是logn?
7.练习1.16

1
2
3
4
5
6
7
(define (fast-expt-iter a b n)
(cond ((= n 1) (* a b))
((not (even? n)) (fast-expt-iter (* a b) b (- n 1)))
(else (fast-expt-iter a (square b) (/ n 2)))))
(define (fast-expt b n)
(fast-expt-iter 1 b n))

通过这道题,我总结到了,在目前的lisp学习中,主要是递归过程,所以应该在最开始的时候将出口留好,而不是放在随后的过程中。
8.练习1.17

1
2
3
4
(define (* a b)
(cond ((= b 1) a)
((even? b) (double (* a (halve b))))
(else (+ a (* a (- b 1))))))

这道题,额,没考虑b为0的时候,看来测试用例做的不够全面啊。改为

1
2
3
4
(define (* a b)
(cond ((= b 0) 0)
((even? b) (double (* a (halve b))))
(else (+ a (* a (- b 1))))))

即可!不过貌似也没考虑正负数什么了,说白了就是练习,理解这种“折半”的计算方式。

Jerky Lu wechat
欢迎加入微信公众号