第一章两天前就读完了,因为工作上的事情拖到现在才来做最后这七道题,这些题目都是要求写一个过程返回另一个过程作为结果。
习题1.40,显而易见,要求cubic过程返回的就是方程本身,照着定义来就行了:
习题1.41,注意到了题目已经说明了:以 有一个参数的过程做参数,那就很简单了:
返回lambda构造的过程,参数过程应用两次即可,那么
习题1.42,组合应用:
习题1.43,在1.42基础上使用递归即可:
习题1.44,在1.43基础上,首先定义smooth过程:
然后使用repeated过程产生n次平滑函数:
习题1.45,不是一下子能说清楚,经过测试可以知道n次方根搜索不动点,平均阻尼需要经过log2(n)(以2为底的对数)重复才会收敛,因此:
习题1.46,这题很有趣,产生过程的过程也是递归的,相当好玩,iterative-improve产生的过程需要递归调用自身,仍然使用iterative-improve产生:
重写sqrt如下:
重写fixed-point过程如下:
习题1.40,显而易见,要求cubic过程返回的就是方程本身,照着定义来就行了:
(define (cubic a b c)
(lambda(x) ( + ( * x x x) ( * a x x) ( * b x) c)))
(lambda(x) ( + ( * x x x) ( * a x x) ( * b x) c)))
习题1.41,注意到了题目已经说明了:以 有一个参数的过程做参数,那就很简单了:
(define (double g) (lambda(x) (g (g x))))
返回lambda构造的过程,参数过程应用两次即可,那么
>
(((double (double double)) inc)
5
)
21
21
习题1.42,组合应用:
(define (composite f g)
(lambda(x) (f (g x))))
(lambda(x) (f (g x))))
习题1.43,在1.42基础上使用递归即可:
(define (repeated f n)
( if ( = n 1 )
f
(composite f (repeated f ( - n 1 )))))
( if ( = n 1 )
f
(composite f (repeated f ( - n 1 )))))
习题1.44,在1.43基础上,首先定义smooth过程:
(define (smooth f)
(lambda(x) ( / ( + (f ( - x dx)) (f x) (f ( + x dx))) 3 )))
(lambda(x) ( / ( + (f ( - x dx)) (f x) (f ( + x dx))) 3 )))
然后使用repeated过程产生n次平滑函数:
(define (repeate
-
smooth n)
(repeated smooth n))
(repeated smooth n))
习题1.45,不是一下子能说清楚,经过测试可以知道n次方根搜索不动点,平均阻尼需要经过log2(n)(以2为底的对数)重复才会收敛,因此:
(define (nth
-
root
-
test x n k)
(fixed - point ((repeated average - damp k) (lambda (y) ( / x (fast - expt y ( - n 1 )))))
1.0 ))
(fixed - point ((repeated average - damp k) (lambda (y) ( / x (fast - expt y ( - n 1 )))))
1.0 ))
习题1.46,这题很有趣,产生过程的过程也是递归的,相当好玩,iterative-improve产生的过程需要递归调用自身,仍然使用iterative-improve产生:
(define (iterative
-
improve good
-
enough improve
-
it)
(lambda(guess)
( if (good - enough guess)
guess
((iterative - improve good - enough improve - it) (improve - it guess)))))
如果猜测结果足够,返回猜测结果,如果没有,递归调用lambda产生的这个过程应用于改进后的猜测值。
(lambda(guess)
( if (good - enough guess)
guess
((iterative - improve good - enough improve - it) (improve - it guess)))))
重写sqrt如下:
(define (sqrtt x)
(define (good - enough ? guess)
( < ( abs ( - (square guess) x)) 0.0001 ))
(define (improve guess)
(average guess ( / x guess)))
(iterative - improve good - enough ? improve))
注意,这里的sqrrt过程产生的是一个以初始猜测值为参数的过程,所有调用应该这样:
(define (good - enough ? guess)
( < ( abs ( - (square guess) x)) 0.0001 ))
(define (improve guess)
(average guess ( / x guess)))
(iterative - improve good - enough ? improve))
>
((sqrtt
4
)
1.0
)
2.000000000929222947
下面的fixed-point过程也是如此。
2.000000000929222947
重写fixed-point过程如下:
(define (fixed
-
point f)
(define tolerance 0.00001 )
(define (good - enough ? guess)
( < ( abs ( - guess (f guess))) tolerance))
(define (improve guess) (f guess))
(iterative - improve good - enough ? improve))
(define tolerance 0.00001 )
(define (good - enough ? guess)
( < ( abs ( - guess (f guess))) tolerance))
(define (improve guess) (f guess))
(iterative - improve good - enough ? improve))