第一章兩天前就讀完了,因為工作上的事情拖到現在才來做最后這七道題,這些題目都是要求寫一個過程返回另一個過程作為結果。
習題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))