练习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

递归计算过程:

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

迭代计算过程:

(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中。

下面的结果是别人的例子,不是有多好,只是给我很大的启发,参数的移动可以增强程序的灵活性,不错!!我得记住这一点。。。

(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

(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

(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

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

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

(define (* a b)
  (cond ((= b 0) 0)
	((even? b) (double (* a (halve b))))
	(else (+ a (* a (- b 1))))))
即可!不过貌似也没考虑正负数什么了,说白了就是练习,理解这种“折半”的计算方式。



发布了179 篇原创文章 · 获赞 1 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览