锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
(define (accumulate-n op init seqs)
(if (null? (car seqs)) null
(cons (accumulate op init (map# (lambda(x) (car x)) seqs))
(accumulate-n op init (map# (lambda(x) (cdr x)) seqs)))))
2.38
;3/2
;> (fold-left / 1 (list 1 2 3))
;1/6
;> (fold-right list null (list 1 2 3))
;(1 (2 (3 ())))
;> (fold-left list null (list 1 2 3))
;(((() 1) 2) 3)
; (fold-right op i (a b c)) = (op a (op b (op c i)))
; (fold-left op i (a b c)) = (op (op (op i a) b) c)
瑕?fold-right 鍜?fold-left 寰楀埌鐩稿悓鐨勭粨鏋滐紝鏄劇劧闇瑕?op 婊¤凍浜ゆ崲寰嬨?br>
2.39
(fold-right (lambda(x y) (append y (list x))) null seqs))
(define (reverse-2 seqs)
(fold-left (lambda(x y) (cons y x)) null seqs))
]]>
(accumulate (lambda(x y) (cons (p x) y)) null seque))
(define (append seq1 seq2)
(accumulate cons seq2 seq1))
(define (length seque)
(accumulate (lambda(x y) (+ 1 y)) 0 seque))
2.34
(accumulate (lambda(this-coeff higher-coeff)
(+ this-coeff (* x higher-coeff)))
0 coeff-seque))
2.35
(accumulate + 0 (map (lambda(x)
(if (pair? x) (count-leaves+ x) 1))
t)))
]]>
(define (iter lst-o lst-d)
(cond ((null? lst-o)
lst-d)
((not (pair? (car lst-o)))
(iter (cdr lst-o)
(cons (car lst-o) lst-d)))
(else
(iter (cdr lst-o)
(cons (deep-reverse (car lst-o))
lst-d)))))
(iter lst null))
2.28
(define (iter tree lst)
(cond ((null? tree) lst)
((not (pair? tree)) (cons tree lst))
(else (iter (car tree) (iter (cdr tree) lst)))))
(iter x null))
2.30
(cond ((null? x) null)
((not (pair? x)) (* x x))
(else (cons (square-tree- (car x))
(square-tree- (cdr x))))))
(define (square-tree x)
(map (lambda(subtree)
(if (pair? subtree)
(square-tree subtree)
(* subtree subtree)))
x))
2.31
(map (lambda(subtree)
(if (pair? subtree)
(tree-map proc subtree)
(proc subtree)))
tree))
(define (square-tree+ tree)
(tree-map (lambda(x) (* x x)) tree))
2.32
(if (null? s)
(list null)
(let ((rest (subsets (cdr s))))
(append rest (map (lambda(x) (cons (car s) x)) rest)))))
鍜屾崲闆墮挶闂鐨勬濊礬鏄竴鏍風殑錛屽浜庝竴涓泦鍚堢殑鎵鏈夊瓙闆嗙殑闆嗗悎錛屽彲浠ュ垎涓轟袱閮ㄥ垎錛屽惈鏈夌涓涓厓绱犲拰涓嶅惈絎竴涓厓绱犵殑闆嗗悎銆傝屼笖鍚涓涓厓绱犵殑鎵鏈夊瓙闆嗛櫎鍘葷涓涓厓绱狅紝鎭板ソ姝f槸鎵鏈変笉鍚涓涓厓绱犵殑瀛愰泦銆?/span>
涔熷彲浠ユ崲涓濊礬錛屽浜庨泦鍚圓錛岃瀹冨彲浠ヨ〃紺轟負 (a1)∪(a2,...,an) 錛岃?(a2,...,an) 鐨勬墍鏈夊瓙闆嗙殑闆嗗悎鏄?B=(B1,...Bm),閭d箞鍙互璇佹槑A鐨勬墍鏈夊瓙闆嗙殑闆嗗悎 C=B∪((A1)∪B1,(A1)∪B2,...,(A1)∪Bm);
璇佹槑錛氳 X 鏄?A 鐨勪竴涓瓙闆嗭紝閭d箞濡傛灉 a1∈X錛岄偅涔?X∈((A1)∪B1,(A1)∪B2,...,(A1)∪Bm)錛屽惁鍒?/span>X∈B錛屾墍浠?br> X∈C
]]>
2.25
(caar (list (list 7)))
(cadadr (cadadr(cadadr (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))))
2.26
((1 2 3) 4 5 6)
((1 2 3) (4 5 6))
]]>
(if (null? (cdr lst))
(cons (car lst) ())
(last-pair (cdr lst))))
2.18
(define (iter lst-o lst-d)
(if (null? lst-o)
lst-d
(iter (cdr lst-o) (cons (car lst-o) lst-d))))
(iter lst null))
2.20
(define (filter lst ok?)
(if (null? lst)
()
(if (ok? (car lst))
(cons (car lst) (filter (cdr lst) ok?))
(filter (cdr lst) ok?))))
(if (even? x)
(cons x (filter lst (lambda(x) (= 0 (remainder x 2)))))
(cons x (filter lst (lambda(x) (= 1 (remainder x 2)))))))
2.21
(if (null? items)
()
(cons (* (car items) (car items))
(square-list- (cdr items)))))
(define (square-list items)
(map (lambda(x) (* x x)) items))
2.22
絎竴縐嶆瘡嬈″彇鍑洪鍏冪礌騫蟲柟鍚庡墠鎻掑埌鏂拌〃錛岃薄reverse榪囩▼綾諱技錛屾墍浠ユ槸鍙嶇殑銆?/span>
絎簩縐嶅彧涓嶈繃鏄妸鏂拌〃鍓嶆彃鍒板厓绱犲墠錛屽緱鍒扮殑鐢氳嚦涓嶆槸涓涓猯ist錛岃屾槸
((((() . 1) . 4) . 9) . 16)
2.23
(if (not (null? items))
((lambda() (proc (car items))
(for-each proc (cdr items))))))
]]>
2.01
(let ((g (gcd x y)))
(if (< y 0)
(cons (/ (- x) g) (/ (- y) g))
(cons (/ x g) (/ y g)))))
2.02
(define (x-point p) (car p))
(define (y-point p) (cdr p))
(define (make-segment p1 p2) (cons p1 p2))
(define (start-seg line) (car line))
(define (end-seg line) (cdr line))
(define (midpoint-segment line)
(make-point (/ (+ (x-point (start-seg line)) (x-point (end-seg line))) 2.0)
(/ (+ (y-point (start-seg line)) (y-point (end-seg line))) 2.0)))
2.04
; (cdr+ (cons+ x y) = ((cons+ x y) (lambda(p q) p)))
; = (lambda(m)(m x y) (lambda(p q) p)))
; = ((lambda(p q) p) x y)
; = x
(define (cons+ x y)
(lambda(m) (m x y)))
(define (car+ z)
(z (lambda(p q) p)))
(define (cdr+ z)
(z (lambda(p q) q)))
2.05
2^a/2^c = 3^d/3^b
2^(a-c) = 3^(d-b)
a=c && d=b
2.06
(define two (lambda(f) (lambda(x) (f (f x)))))
2.07
(if (> (car pair) (cdr pair))
(car pair)
(cdr pair)))
(define (lower-bound pair)
(if (> (car pair) (cdr pair))
(cdr pair)
(car pair)))
2.08
(add-interval x (make-interval (- (upper-bound y))
(- (lower-bound y)))))
]]>
;1.43
(define (double f)
(lambda(x) (f (f x))))
;;(((double (double double)) inc) 5) = 5+16 =21
;;;;;;;;;;;;;
;1.42
(define (compose f g)
(lambda(x) (f (g x))))
;;;;;;;;;;;;;;;
;1.43
(define (repeated f n)
(if(= n 1) f
(compose f (repeated f (- n 1)))))
;;;;;;;;;;;;;;;;
;1.44
(define (smooth f)
(lambda(x) (/ (+ (f (- x dx))
(f x)
(f (+ x dx)))
3)))
(define (smooth-n f)
(repeated f n))
(define (smooth-n f n)
((repeated smooth n) f))
]]>
鑻?nbsp;φ=0 錛?nbsp;鍒?nbsp;φ^2=φ+1 涓嶆垚绔?nbsp;錛?nbsp;鏁?nbsp;φ≠0
φ^2 = φ+1 ==>
φ = (φ+1)/φ = 1 + (1/φ)
1.36
(define (fixed-point f first-guess)
(define (close-enough? x y)
(< (abs (- x y)) tolerance))
(define (try guess)
(let ((next (f guess)))
(display next)
(newline)
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
騫沖潎闃誨凹娉曞拰涓嶇敤騫沖潎闃誨凹鍒嗗埆濡備笅錛屽畠浠鏁板垎鍒負 9 鍜?34 銆?br>
(fixed-point (lambda(x) (/ (log 1000) (log x))) 2.0)
1.37
(define (redu i)
(if (= i k)
(/ (n i) (d i))
(/ (n i) (+ (d i) (redu n d (+ i 1))))))
(redu 1))
(define (cont-frac n d k)
(define (iter i result)
(if (= i 0)
result
(iter (- i 1) (/ (n i) (+ (d i) result)))))
(iter k 0))
(define (get-phai k)
(/ 1 (cont-frac (lambda(i) 1.0) (lambda(i) 1.0) k)))
(define (get-k)
(define (iter i)
(if (< (abs (- (get-phai i) 1.6180)) 0.00005)
i
(iter (+ i 1))))
(iter 1))
k = 11 鏃訛紝綺懼害婊¤凍 4 浣?鍗佽繘鍒舵暟銆?br>
1.38
(cond ((= i 2) 2.0)
((and (> i 2) (= 0 (remainder (- i 2) 3)))
(* (/ (+ i 1) 3.0) 2.0))
(else 1.0)))
(define (get-e k)
(+ 2 (cont-frac (lambda(i) 1.0) euler-d k)))
1.39
(define (tan-n i)
(if (= 1 i)
x
(- (* x x))))
(cont-frac tan-n (lambda(i) (- (* i 2.0) 1.0)) k))
]]>
(f f)
(f 2)
(2 2)
瑙i噴鍣ㄥ皢鎶ラ敊錛?#8216;2’鏄竴涓湭瀹氫箟榪囩▼銆?/span>
]]>
(define (get-h) (/ (- b a) n))
(define (get-y k) (f (+ a (* k (get-h)))))
(define (simpson-term k)
(cond ((= k 0) (get-y k))
((= k n) (get-y k))
((= (remainder k 2) 0) (* 2.0 (get-y k)))
(else (* 4.0 (get-y k)))))
(define (simpson-next k) (+ k 1))
(* (/ (get-h) 3.0) (sum simpson-term 0 simpson-next n)))
1.30
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ (term a) result))))
(iter a 0))
1.31
(define (product-re term a next b)
(if (> a b)
1
(* (term a)
(product-re term (next a) next b))))
;;榪唬
(define (product term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (* result (term a)))))
(iter a 1))
(define (pi-product b)
(define (pi-term k) (/ (* (- k 1) (+ k 1)) k k))
(define (pi-next k) (+ k 2))
;;(* 4.0 (product-re pi-term 3.0 pi-next b))) ;;閫掑綊
(* 4.0 (product pi-term 3.0 pi-next b))) ;;榪唬
1.32
(accumulate + 0 term a next b))
(define (product term a next b)
(accumulate * 1 term a next b))
;;閫掑綊
(define (accumulate-re combiner null-value term a next b)
(if (> a b)
null-value
(combiner (term a)
(accumulate-re combiner null-value term (next a) next b))))
;;榪唬
(define (accumulate combiner null-value term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (combiner (term a) result))))
(iter a null-value))
1.33
(define (iter a result)
(if (> a b)
result
(if (filter? (term a))
(iter (next a) (combiner (term a) result))
(iter (next a) result))))
(iter a null-value))
(define (sum-prime a b)
(define (sum-prime-term k) k)
(define (sum-prime-next k) (+ k 1))
(filtered-accumulate + 0 sum-prime-term a sum-prime-next b prime?))
(define (relatively-prime-product n)
(define (relatively-prime? k) (= (gcd k n) 1))
(define (term k) k)
(define (next k) (+ k 1))
(filtered-accumulate * 1 term 2 next (- n 1) relatively-prime?))
]]>
瀵逛簬Fermat媯鏌ワ紝鍥犱負鍏鋒湁log n 鐨勫闀塊樁錛屾墍浠ュ浜?n^2 鍜?n 鐨勬鏌ョ殑鏃墮棿姣?鐞嗚涓婂簲璇ユ槸 2錛?錛?瀹為檯涓婏紝緇忚繃嫻嬭瘯涔熸瘮杈冩帴榪戯紝褰搉姣旇緝澶ф椂銆?br>鑻ヤ笌棰勮涓嶇錛屽彲鑳藉洜涓?n 姣旇緝灝忥紝鎴栬呭瓧闀垮彂鐢熷彉鍖栵紝姣斿 n > 2^32 錛堝弬瑙佷笅棰橈級
1.25
浠呬粠鐞嗚鍒嗘瀽錛孉lyssa 鐨勬敼鍔ㄤ笉浼氬紩璧峰闀塊樁鐨勫彉鍖栵紝浣嗗疄闄呬笂褰?Fermat 媯鏌ョ殑 n 紼嶅井澶т竴鐐癸紝閫熷害灝變細寰堟參銆備富瑕佸師鍥?灝辨槸 base^exp 鏄竴涓潪甯稿ぇ鐨勬暟錛屽彲鑳借繙榪滆秴榪?涓涓?2浣嶆満瀛楃殑琛ㄧず鑼冨洿 2^32 錛屽湪 scheme 閲屽彲鑳界敤鑻ュ共涓?32-bit 闈犺蔣浠跺疄鐜拌繍綆楋紝榪欏皢瀵艱嚧璁$畻鎬ラ熷闀褲傛棤璁烘槸浼犻掋佽繍綆楄繕鏄眰妯°?br>瀹為檯涓?1.22銆?.23銆?.24 鐨勫嚑涓鐩彲鑳介兘浼氶亣鍒板瓧闀垮彉鍖栧紩璧風殑璁$畻閫熷害紿佸彉銆?br>
1.26
Fermat 媯鏌ユ鏄洜涓?榪炵畫姹傚鉤鏂圭殑姹傚箓鏂規硶錛屼嬌寰楃殑澧為暱闃跺彉涓?log n錛?鑰岃繖鍧囨潵婧愪簬 b^(2n) = (b^n)^2錛?/span>Louis 鐨勬柟娉曡姹傚箓鍙堝彉鎴愪簡榪炰箻錛宐^(2n) = b^n*b^n = (b*b*...*b)*(b*b*...*b)錛屾眰騫傜殑澧為暱闃跺彉鎴愪簡 O(n)錛孎ermat 媯鏌ョ殑澧為暱闃惰嚜鐒朵篃鍙樻垚浜?O(n)銆?br>
1.27
(fermat-iter (- n 1) n))
(define (fermat-iter a n)
(cond ((= a 0) #t)
((= (expmod a n n) a) (fermat-iter (- a 1) n))
(else #f)))
1.28
棣栧厛鏉ョ湅錛孎ermat 灝忓畾鐞嗙殑涓涓彉褰細
p 鏄礌鏁? 1<a<p, 鏈?a^p % p = a
==> a^p = kp + a ==> a^p - a = kp ==> a(a^(p-1)-1) = kp ==> a^(p-1) -1 = k'p
==> a^(p-1) % p = 1
榪欎釜鍙樺艦灝辨槸棰樼洰涓彁鍒扮殑錛岃繖涓艦寮忓拰璐歸┈灝忓畾鐞嗘槸絳変環鐨勶紙浣嗘槸濂囨殑鏄紝鎴戞病鏈夊彂鐜板凡鐭ョ殑鍑犱釜Carmichael鏁拌兘澶熻翰榪囪繖涓彉褰㈢殑媯鏌ワ紝鏈夊緟鐮旂┒鈶?/span>錛?br>
鍐嶆潵鐪嬶紝miller-rabin 绱犳ф祴璇曠殑鍘熺悊錛?br>
p 鏄礌鏁幫紝 1<a<p, 涓?a^2 % p = 1
==> (a^2-1) % p = 0 ==> (a+1)(a-1) % p =0
閭d箞 a+1 % p = 0 鎴栬?a-1 % p =0,
鍙?a<p 涓?p 鏄礌鏁幫紝鎵浠?br>a = 1 鎴栬?a = p-1 錛堣繖涓や釜鍙仛 1妯鐨勫鉤鍑″鉤鏂規牴錛?br>
浠g爜濡備笅錛?br>
(define (check-1? t)
(if (and (> a 1)
(< a (- n 1))
(= t 1))
0 t))
(check-1? (remainder (square a) n)))
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
;(remainder (square (expmod base (/ exp 2) m)) m))
(check-nontrivial-sqrt-of-one (expmod base (/ exp 2) m) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
(define (miller-rabin-test n)
(define (iter x n)
(cond ((= x 0) #t)
((= (expmod x (- n 1) n) 1) (iter (- x 1) n))
(else #f)))
(iter (- n 1) n))
鈶?瀵逛簬 Carmichael 鏁?n 錛屽疄闄呬笂涓嶈兘瀹屽叏閫氳繃 a^(n-1)%n = 1 鐨勬鏌?/span>錛岄櫎闈?a 涓?n 浜掔礌錛屽綋 a 涓?n 鐨勭礌鍥犲瓙鏃訛紝涓嶈兘閫氳繃錛屾瘮濡?Carmichael 絎竴涓?561 = 3*11*17錛?鑰?3^560%561 = 375 ≠ 1 銆傚彲浠ョ▼搴忛獙璇佽繖涓?鎵浠ユ垜璁や負錛?/span>a^(n-1)%n = 1 鐨勬鏌ユ瘮 a^n%n = a 鐨勬鏌ユ洿涓ユ牸錛屾槸涓嶆槸涓嶅瓨鍦ㄥ悎鏁伴氳繃瀹屽叏鐨?a^(n-1)%n = 1 鐨勬鏌ュ憿錛熸垜涓嶆暍璇淬備絾鎶婅繖涓粨璁烘殏鏃惰鍦ㄨ繖閲岋紝甯屾湜鑳藉緱鍒板府鍔╂垨鑰呭弽椹熾?008-04-02 23:56
]]>
199
> (smallest-divisor 1999)
1999
> (smallest-divisor 19999)
7
>
1.22
鍦?DrScheme 涓病鏈夊搴旂殑 runtime 榪囩▼錛屾垜浠敤鍐呭緩鐨?current-milliseconds
鏉ヤ唬鏇匡紝榪欎釜榪囩▼榪斿洖鐨勬槸緋葷粺鐨?ms 鏁般?br>鍚屾椂錛屽湪 Windows 涓嬫棤娉曠簿紜〃紺?16ms 浠ヤ笅鐨勭簿搴︼紙鍙兘鏃墮棿鐗囩殑澶у皬鏄?16ms 錛夛紝鎵浠ヨ繖閲岀敤姣旇緝澶х殑鏁版潵嫻嬭瘯銆?br>浠g爜濡備笅
(define (runtime) (current-milliseconds))
(define (start-prime-test n start-time)
(and (prime? n)
(report-prime (- (runtime) start-time))))
(define (report-prime elapsed-time)
(display " *** ")
(display elapsed-time))
(define (search-iter cur-num index start-time)
(newline)
(display cur-num)
(if (not (= index 0))
(if (start-prime-test cur-num start-time)
(search-iter (+ cur-num 2) (- index 1) start-time)
(search-iter (+ cur-num 2) index start-time))))
(define (search-for-primes start-number)
(if (even? start-number)
(search-iter (+ start-number 1) 3 (runtime))
(search-iter start-number 3 (runtime))))
榪欓噷鐢ㄥ埌浜?prime? 璋撹瘝錛屼唬鐮佷笉鍐嶅榪般?br>
|------+--------+--------+-------|
|10^9 | 10^10 | 10^11 | 10^12 | => start-number
|------+--------+--------+-------|
|31 | 250 | 609 | 1953 | (ms)
|47 | 406 | 1203 | 3844 |
|78 | 625 | 1859 | 5719 |
|------+--------+--------+-------|
浠庝笂琛ㄥ彲浠ョ湅鍑猴紝闄や簡鍓嶄袱鍒椾箣闂達紝鍚庡垪鐨勬暟瀛楅兘鏄墠鍒楁暟瀛楃殑 3 鍊嶅乏鍙籌紝榪戜技浜?√10 鈮?3.16銆傚疄闄呬笂錛岄殢鐫 n 鐨勪笉鏂澶э紝榪欎釜鏁頒細閫愭笎閫艱繎 √10銆?br>
1.23
(if (= n 2) 3 (+ n 2)))
(define (find-divisor n test-divisor)
(cond ((> (square test-divisor) n) n)
((divides? test-divisor n) test-divisor)
(else (find-divisor n (next test-divisor)))))
璁$畻緇撴灉濡備笅錛?br>|--------+--------+-------|
| 10^10 | 10^11 | 10^12 | => start-number
|--------+--------+-------|
| 141 | 297 | 1078 | (ms)
| 219 | 609 | 2093 |
| 313 | 984 | 3140 |
|--------+--------+-------|
鍙互鐪嬪嚭榪欎釜姣斿煎ぇ綰﹀湪 1.8(1/0.55) 宸﹀彸錛屽彲鑳藉師鍥犳槸鍏跺畠鐨勮綆楅渶瑕佹椂闂達紝浣嗗綋 n 涓嶆柇澧炲ぇ錛屽叾瀹冭綆楁槸甯告暟闃訛紝榪欎釜姣斿間細涓嶆柇鎺ヨ繎2銆?br>
]]>
涓嬮潰鐢?% 琛ㄧず榪囩▼ remainder錛岄偅涔堟鍒欏簭鐨勮繃紼嬪涓嬶細
(if (= 40 0) 206 (gcd 40 (% 206 40)))
(gcd 40 (% 206 40))
(if (= (% 206 40) 0) ;<## 1> [6]
40
(gcd (% 206 40) (% 40 (% 206 40))
(gcd (% 206 40) (% 40 (% 206 40)))
(if (= (% 40 (% 206 40)) 0) ;<## 2> [4]
(% 206 40)
(gcd (% 40 (% 206 40)) (% (% 206 40) (% 40 (% 206 40)))))
(gcd (% 40 (% 206 40)) (% (% 206 40) (% 40 (% 206 40))))
(if (= (% (% 206 40) (% 40 (% 206 40))) 0) ;<## 4>[2]
(% 40 (% 206 40))
(gcd (% (% 206 40) (% 40 (% 206 40)))
(% (% 40 (% 206 40)) (% (% 206 40) (% 40 (% 206 40))))))
(gcd (% (% 206 40) (% 40 (% 206 40)))
(% (% 40 (% 206 40)) (% (% 206 40) (% 40 (% 206 40))))))
(if (= (% (% 40 (% 206 40)) (% (% 206 40) (% 40 (% 206 40))))) 0) ;<## 7>[0]
(% (% 206 40) (% 40 (% 206 40)))
(gcd ...)
(% (% 206 40) (% 40 (% 206 40))) ;<## 4>[2]
鍙互鐪嬪嚭闇瑕佽皟鐢?remainder 鍏?1+2+4+7+4 = 18 嬈°?br>
搴旂敤搴忚綆楄繃紼嬪涓嬶細
(if (= 40 0) 206 (gcd 40 (% 206 40))) ;<##>
(gcd 40 6)
(if (= 6 0) 40 (gcd 6 (% 40 6))) ;<##>
(gcd 6 4)
(if (= 4 0) 6 (gcd 4 (% 6 4))) ;<##>
(gcd 4 2)
(if (= 2 0) 4 (gcd 2 (% 4 2))) ;<##>
(gcd 2 0)
(if (= 0 0) 2 (gcd 0 (% 2 0)))
2
鍙互鐪嬪嚭鍏遍渶 4 嬈°?br>
]]>
(fast-expt-iter x n 1))
(define (fast-expt-iter x n a)
(cond ((= n 0) a)
((even? n) (fast-expt-iter (square x)
(/ n 2)
a))
(else (fast-expt-iter x
(- n 1)
(* a x)))))
1.17
(if (= y 0)
0
(+ x (multi x (- y 1)))))
(define (fast-multi x y)
(cond ((= y 0) 0)
((even? y) (double (fast-multi x
(half y))))
(else (+ x (fast-multi x (- y 1))))))
(define (double x) (+ x x))
(define (half y) (/ y 2))
1.18
(define (half y) (/ y 2))
(define (fast-multi x y)
(fast-multi-iter x y 0))
(define (fast-multi-iter x y p)
(cond ((= y 0) p)
((even? y) (fast-multi-iter (double x)
(half y)
p))
(else (fast-multi-iter x (- y 1) (+ p x)))))
1.19
;T(pq):(bq+aq+ap, bp+aq)=>((bp+aq)q + (bq+aq+ap)q + (bq+aq+ap)p,
; (bp+aq)p + (bq+aq+ap)q)
; => (2bpq+2aqq+bqq+2apq+app, bpp+2apq+bqq+aqq)
; => (b(2pq+qq)+a(2pq+qq)+a(qq+pp), b(qq+pp)+a(2pq+qq))
;q' = 2pq+qq
;p' = qq+pp
;
(define (fib n)
(fib-iter 1 0 0 1 n))
(define (fib-iter a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-iter a
b
(+ (* p p) (* q q))
(+ (* 2 p q ) (* q q))
(/ count 2)))
(else (fib-iter (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q
(- count 1)))))
]]>
璁$畻榪囩▼鐨勬爲濡備笅錛?br>
寰堝鏄撶湅鍑猴紝璁$畻榪囩▼鐨勭┖闂撮渶姹傦紝涔熷氨鏄爲鐨勬繁搴︼紝鍙栧喅浜庢渶宸﹁竟鐨勫瓙鏍戯紝鍗?n 1)錛屽畠鐨勬繁搴︽槸n+6錛孫(n).
鐒跺悗瀵逛簬璁$畻姝ユ暟錛屼篃灝辨槸鏍戠殑鑺傜偣鏁幫紝鎴戜滑鐭ラ亾瀵逛簬涓涓簩鍙夋爲錛屾爲鐨勮妭鐐規暟 = 宸﹀瓙鏍戣妭鐐規暟 + 鍙沖瓙鏍戣妭鐐規暟 + 1.
鍏堟潵鐪?(n 1) 瀛愭爲錛岃瀹冪殑鑺傜偣鏁版槸f(n), 鑰屼笖鎬繪湁錛岄潪鍙惰妭鐐瑰乏瀛愭爲鑺傜偣鏁頒負1
褰?n=1錛宖(1) = 3
n>1, f(n) = 1 + f(n-1) + 1 = f(n-1) + 2 = f(n-2) + 2*2
= f(n-(n-1)) + 2*(n-1) = 2n + 1
= O(n)
鍐嶆潵鐪?(n 2) 瀛愭爲錛岃瀹冪殑鑺傜偣鏁?g(n), 璁?鈹?n/5 鈹?= A
g(n) = f(n) + g(n-5) + 1 = f(n) + f(n-5) + g(n-5*2) + 2
= f(n) + ... + f(n-5*(A-1)) + g(n-5*A) + 2A
= O(n^2)
渚濇綾繪帹錛屽彲浠ュ緱鍑虹粨璁?(n 5) 鐨勮綆楁鏁板闀跨殑闃?涓?O(n^5)
1.15
a) 12.15 榪為櫎 5嬈?3 灝忎簬 0.1 錛屾墍浠ユ槸 5嬈?br>b) 鍙互鐪嬪嚭姣忚皟鐢ㄤ竴嬈?p 榪囩▼錛岄渶瑕侀掑綊1嬈?sine 錛岀┖闂村姞1錛岃綆楁鏁板姞2錛屽叧閿槸p鐨勬鏁幫細
瀵逛簬a錛岃皟鐢ㄦ鏁皌錛岄偅涔?a*3^(-t) < 0.1 , 鍗?10a < 3^t ==> lg(10a)/lg3 < t,
鎵浠ュ闀塊樁 絀洪棿鍜屾椂闂?閮戒負 O(log a)
]]>
鍚戝ぇ瀹舵帹鑽?SICP錛屼笉鐭ラ亾鏈夊灝戜漢鐪嬩簡錛屼篃涓嶇煡閬撴湁澶氬皯浜烘槑鐧戒簡錛屾洿涓嶇煡閬撴湁澶氬皯浜烘儕鍙逛簡銆傛垨鑰呬綘鏍規湰涓嶅睉涓欏撅紝鎴栬呬綘鐪嬭 Lisp 閭e眰灞傛嫭鍙峰績鐢熺晱鎯э紝鍙堟垨鑰呬綘浜嗕簡涓鐬ワ紝瑙夊緱娌′粈涔堢簿褰╀箣澶勩傞偅鎴戠湡鐨勫緢澶辨湜銆?/span>
鎴戜負浠涔堣鎺ㄨ崘SICP錛岃屼笖涓轟粈涔堝姝ゆ墽鐫錛熻繖鏈笉綆楀帤鐨勪功甯︾粰鎴戠殑瑙傚康錛屾槸浠庢湭鏈夎繃鐨勶紝鏄叧涔庝簬杞歡鏈川鐨勩傛浘鍑犱綍鏃訛紝鎴戣寰楁垜鐪嬪埌浜嗚綆楁満緙栫▼涔︿腑娌℃湁鐨勫摬瀛﹁錛屼絾榪欎竴嬈℃垜鐨勬ⅵ鐮寸伃浜嗭紝閭d簺宸茬粡琚啓榪涗功閲屽樊涓嶅蹇?30 騫翠簡銆?/span>
瀵逛簬 SICP錛屾垜鐪熸綆楃湅瀹岀殑錛屾亹鎬曞彧鏈夌涓绔犮傛垜鐜板湪灝辨潵璋堣皥鎴戠殑蹇冨緱錛屼互鍐嶆鍚戜綘灞曠幇榪欐湰涔︾殑欖斿姏銆?/span>
絎竴绔犱綔涓哄熀紜錛屼綔鑰呭茍娌℃湁璞″悗緇珷鑺傚啓澶鐨勮蔣浠舵濇兂錛屼富瑕佽繕鏄粙緇?Scheme 璇█錛屾墍浠ヨ崏鑽夌湅鍘伙紝娌′粈涔堢簿杈熶箣澶勩備笉榪囧湪絎竴绔犱腑錛屼綔鑰呯敤浜嗗ぇ閲忕殑綃囧箙鏉ユ帰璁ㄦ暟瀛﹂棶棰橈紝鍥犱負浠栨兂鍚戜綘鎻ず紼嬪簭璁捐涓殑鏍稿績鍝插錛氭娊璞°傝屾暟瀛︽棤鐤戞槸鏈濂界殑渚嬪瓙銆?/span>
浜嗚В鏁板鍙茬殑浜猴紝搴旇鐭ラ亾鏁翠釜鏁板鍙詫紝灝辨槸涓涓笉鏂娊璞$殑鍘嗗彶銆傚彜甯岃厞浜哄皢瀛楁瘝寮曞叆璁$畻錛屼嬌鏁板涓嶅啀鍙槸綆楁湳錛岃屼笖鍏鋒湁琛ㄨ揪鎶借薄瑙勫垯鐨勮兘鍔涖傝繎浠f暟瀛﹀鍑芥暟鍜屽井縐垎鐨勬帰姹備腑錛岀敤 f(x) 鏇夸唬浜嗗欏瑰紡琛ㄨ揪寮忥紝鍑芥暟鏇翠竴鑸簡錛岀劧鍚?n 緇寸┖闂淬佸鍒嗘瀽銆佹槧灝勩佹硾鍑斤紝鎶借薄浠f暟銆佺兢璁猴紝絳夌瓑絳夌瓑錛岀洿鍒伴泦鍚堣錛屾懅姣佷簡鏁板鐨勫熀鐭籌紝浣挎暟瀛︾晫鍐嶆闄峰叆娌夋濄?/span>
鏋勯犵▼搴忕殑鏂規硶涔熸槸鎶借薄銆備粠鏈綆鍗曠殑鍏冪礌寮濮嬶紝鍩烘湰鍏冪礌(鑷紨綆楄〃杈懼紡錛屽寘鎷暟瀛楋紝瀛楃涓插拰甯冨皵鍊鹼級錛岀劧鍚庡畾涔夊熀鏈繃紼嬶紙鍩烘湰榪愮畻絎︼紝鍥涘垯榪愮畻鍜屽竷灝旇繍綆楋級錛岃繘涓姝ワ紝鑷畾涔夋爣璇嗙錛堝鍚屼唬鏁幫級錛屽啀鑷畾涔夎繃紼嬶紙鍑芥暟錛夛紝鍐嶅皢榪囩▼浣滀負鍊煎弬涓庤繍綆楋紙楂橀樁榪囩▼錛夈備竴姝ユ鐨勬娊璞★紝褰㈡垚浜嗘暣涓▼搴忕殑緇撴瀯銆傝屾垜浠紪紼嬶紝鏃犻潪灝辨槸浠庣幇瀹炰笘鐣屾娊璞″嚭妯″瀷錛屽啀灝嗘ā鍨嬩笉鏂殑鎻愮偧鎶借薄錛屽睘鎬с佹柟娉曘佺被銆佺戶鎵褲佸眰嬈°佹鏋躲?/span>
緙栫▼灝辨槸涓涓笉鏂娊璞$殑榪囩▼銆傛垜鍐嶆鎶婁綔鑰呭湪絎竴绔犳湯鍐欎笅鐨勭粨璁烘妱鍦ㄨ繖閲岋紝浣滀負鏈鍚庣殑娉ㄨ剼銆?/span>
“浣滀負緙栫▼鑰咃紝鎴戜滑搴旇瀵硅繖綾誨彲鑳芥т繚鎸侀珮搴︽晱鎰燂紝璁炬硶浠庝腑璁懼埆鍑虹▼搴忎腑鐨勫熀鏈娊璞★紝鍩轟簬瀹冧滑鍘昏繘涓姝ユ瀯閫狅紝騫舵帹騫垮畠浠互鍒涘緩濞佸姏鏇村己澶х殑鎶借薄銆傚綋鐒訛紝榪欏茍涓嶆槸璇存誨簲璇ラ噰鐢ㄥ敖鍙兘鎶借薄鐨勬柟寮忓幓鍐欑▼搴忥紝紼嬪簭璁捐涓撳浠煡閬撳浣曟牴鎹伐浣滀腑鐨勬儏鍐碉紝鍘婚夋嫨鍚堥傜殑鎶借薄灞傛銆備絾鏄紝鑳藉熀浜庤繖縐嶆娊璞″幓鎬濊冪‘瀹炴槸鏈閲嶈鐨勶紝鍙湁榪欐牱鎵嶅彲鑳藉湪鏂扮殑涓婁笅鏂囦腑鍘誨簲鐢ㄥ畠浠傞珮闃惰繃紼嬬殑閲嶈鎬э紝灝卞湪浜庢垜浠兘鏄懼紡鍦扮敤紼嬪簭璁捐璇█鐨勮绱犲幓鎻忚堪榪欎簺鎶借薄錛屼嬌鎴戜滑鑳藉儚鎿嶄綔鍏朵粬璁$畻鍏冪礌涓鏍峰幓鎿嶄綔瀹冧滑銆?#8221;
]]>
閫掑綊璁$畻榪囩▼涓?br>
(lambda(n)
(cond ((< n 3) n)
(else (+ (func-recu (- n 1))
(* 2 (func-recu (- n 2)))
(* 3 (func-recu (- n 3))))))))
(lambda(a b c n)
(if (= n 0)
a
(func-iter b c (+ (* 3 a) (* 2 b) c) (- n 1)))))
(define (func n) (func-iter 0 1 2 n))
1.12
涓枃鐗堝師棰樼炕璇戞湁璇紝搴斾負璁$畻pascal涓夎涓殑鍏冪礌銆?br>
;if (k=1) or (k=n), then pas(n,k) = 1
;else pas(n,k) = pas(n-1,k-1) + pas(n-1,k)
(define pas (lambda(n k)
(if (or (= k 1) (= k n))
1
(+ (pas (- n 1) (- k 1))
(pas (- n 1) k)))))
1.13
涓枃鐗堝師棰樼炕璇戦仐婕?鎻愮ず 錛?#968;=(1-√5)/2
宸茬煡錛?#966;^2 = φ + 1, 閭d箞 φ^n = φ^(n-1) + φ^(n-2)
鍚岀悊錛?/span>ψ^2 = ψ + 1, 閭d箞 ψ^n = ψ^(n-1) + ψ^(n-2)
鍙?φ-ψ = (1+√5)/2 - (1-√5)/2 = √5
when n=0, Fib(0) = 0 = (φ^0-ψ^0)/√5
when n=1, Fib(1) = 1 = √5/√5 = (φ-ψ)/√5
when n>2, Fib(n) = Fib(n-1) + Fib(n-2) = (φ^(n-1)-ψ^(n-1))/√5 + (φ^(n-2)-ψ^(n-2))/√5
= ((φ^(n-1)+(φ^(n-2))) - (ψ^(n-1)+ψ^(n-2)))/√5
= (φ^n - ψ^n)/√5
鍙?-1< ψ < 0, 鏁?-0.5< -1/√5< ψ^n/√5 < 1/√5 <0.5
, 鑰?φ^n/√5 = ψ^n/√5 + Fib(n)
鍙煡 |φ^n/√5 - Fib(n)| < 0.5, Fib(n)鏄渶鎺ヨ繎φ^n/√5鐨勬暣鏁般?/span>
]]>
f(x,y) = 2y, x = 0;
2, y = 1;
f(x-1, f(x, y-1));
閭d箞錛屽浜?f(0,n), n>=0
褰?nbsp; n >= 1 鏃訛紝 f(0,n) = 2n 錛?br>鑰屽綋 n = 0 鏃訛紝 f(0,0) = 0 = 2*0錛?涔熸弧瓚?2n 錛?br>鏁?f(0,n) = 2n, n>=0.
瀵逛簬f(1,n), n>=1
褰?n > 1 鏃訛紝鏈?f(1,n) = f(0, f(1, n-1)) = 2*f(1,n-1),
璁?f(1,n) = 2^n
if n = 1, f(1,1) = 2 = 2^1
when n > 1, if f(1,n-1) = 2^(n-1)
then f(1,n) = 2*f(1,n-1) = 2*(2^(n-1)) = 2^n
鏁?f(1,n) = 2^n, n>0.
瀵逛簬f(2,n), n>0
if n > 1 ,then f(2,n) = f(1, f(2, n-1)) = 2^f(2,n-1),
璁?f(2,n) = 2^(2^(... (n 涓?2)
if n = 1, then f(2,1) = 2
when n > 1, if f(2, n-1) = 2^(2^(... (n-1)
then f(2,n) = 2^f(2,n-1) = 2^(2^(
榪欐牱鎴戜滑瀵逛簬 (A 1 10) = 2^10 = 1024, (A 2 4) = 2^(2^(2^2)) = 2^16 = 65536
鑰?(A 3 3) = (A 2 A(3 2)) = A(2 A(2 A(2 1))) = (A 2 4) = 2^16 = 65536
(f n) = (A 0 n) = 2n
(g n) = (A 1 n) = 2^n
(h n) = (A 2 n) = 2^(2^(... (n涓?)
---------------------------------------------
鍦ㄧ綉涓婂彲浠ユ壘鍒板叧浜?Ackermann 鍑芥暟鐨勮璁猴紝涓昏鏄拡瀵硅繖涓弻閫掑綊濡備綍鐢ㄨ凱浠f潵瀹炵幇錛孉ckermann 鍑芥暟鏄?寰峰浗鏁板瀹禬.Ackermann 鍦?928騫存彁鍑虹殑銆傚湪 WikiPedia 鑻辨枃鐗堜笂鍙互鎼滅儲 Ackermann function
璇嶆潯錛屾湁璇︾粏浠嬬粛錛屼笉榪囪繖涓狝ckermann function
鐣ユ湁涓嶅悓銆傚涓嬪浘錛?br>
]]>
(if (= 4 0) 5 (inc (+ (dec 4) 5)))
(inc (+ 3 5))
(inc (if (= 3 0) 5 (inc (+ 2 5))))
(inc (inc (if (= 2 0) 5 (inc (+ 1 5)))))
(inc (inc (inc (if (= 1 0) 5 (inc (+ 0 5))))))
(inc (inc (inc (inc (if (= 0 0) 5 (inc (+ (dec 0) 5)))))))
(inc (inc (inc (inc 5))))
(inc (inc (inc 6)))
(inc (inc 7))
(inc 8)
9
(+ 4 5)
(if (= 4 0) 5 (+ 3 6))
(if (= 3 0) 6 (+ 2 7))
(if (= 2 0) 7 (+ 1 8))
(if (= 1 0) 8 (+ 0 9))
(if (= 0 0) 9 (+ (dec 0) (inc 9)))
9
]]>
(cube-root-iter x 1.0 x))
(define (cube-root-iter last-guess guess x)
(if (enuf? last-guess guess)
guess
(cube-root-iter guess (improve guess x) x)))
(define (enuf? x y)
(< (/ (abs (- x y)) y) 0.001))
(define improve (lambda (y x)
(/ (+ (/ x (* y y)) (* 2 y)) 3)))
]]>
0.10032578510960607
> (sqrt (square 0.05))
0.054237622808967656
> (sqrt (square 0.01))
0.03230844833048122
> (sqrt (square 0.005))
0.031515954454847304
> (sqrt (square 0.001))
0.031260655525445276
> (sqrt (square 0.0001))
0.03125010656242753
>
鍥犱負 guess^2 < c + x
, 褰?x < c 鏃訛紝guess 灝辨洿澶氱殑渚濊禆浜?c 浜嗐?br>
瀵逛簬鐗瑰埆澶х殑鏁幫紝鐢變簬嫻偣鏁板湪鐗瑰埆澶ф椂錛岀鏁fч潪甯告槑鏄撅紝鐩擱偦鐨勪袱涓暟涔嬮棿鐨勫樊璺濅細闈炲父澶э紝瀵艱嚧 |guess^2 - x| 濮嬬粓 澶т簬 c錛岃綆椾究榪涘叆浜?鏃犻檺寰幆銆?br>
姣斿璁$畻 (sqrt 1e300)
浣跨敤鍙樺寲鐜囨敼榪涘悗鐨勪唬鐮佸涓嬶細
(sqrt-iter-new x 1.0 x))
(define (sqrt-iter-new s1 s2 x)
(if (enuf-new? s1 s2)
s2
(sqrt-iter-new s2 (improve s2 x) x)))
(define (enuf-new? s1 s2)
(< (/ (abs (- s1 s2)) s1) 0.001))
鍙互嫻嬬畻鍑犱釜鏁幫紝楠岃瘉緇撴灉榪樻槸姣旇緝濂界殑銆?br>
1.0000000000084744e+150
> (sqrt-new (square 1e-150))
1.0000000000084744e-150
]]>
(cond (pred thenc)
(else elsec)))
(define (iter x y)
(new-if (= x y)
0
(iter (+ x 1) y)))
(define (iter-if x y)
(if (= x y)
0
(iter-if (+ x 1) y)))
(define (iter-cond x y)
(cond ((= x y) 0)
(else (iter-cond (+ x 1) y))))
瀵逛簬 (iter 1 10), (iter-if 1 10), (iter-cond 1 10)
鍏朵腑 iter 浼?瀵艱嚧鍫嗘爤婧㈠嚭錛岃?iter-cond 鍜?iter-if 騫朵笉浼氥?br>
姝ら鍚?.5
鍦?.5涓紝鐢變簬搴旂敤搴忕殑鍘熷洜錛屽湪 test 琛ㄨ揪寮?榪樻病鏈夊睍寮涓?if 鐗規畩褰㈠紡錛坰pecial forms錛夋椂錛?(p)宸茬粡闄峰叆浜嗘棤闄愰掑綊銆?br>
]]>
1.2
or
1.3
榪欎釜闂涓枃鐗堢殑緲昏瘧鏄敊鐨勶紝鍙傜湅鍘熸枃鏄眰騫蟲柟鍜岃屼笉鏄?#8220;鍜?#8221;銆?br />
(define (max x y)(if (< x y) y x))
(define (func x y z)
(+ (square (max x y))
(square (max (min x y) z))))
1.4
<=>
2 def a_plus_abs_b(a,b):
3 if b>0 :
4 x = a + b
5 else:
6 x = a - b
7 return x
1.5鍦ㄧ綉涓婄湅浜嗗緢澶氱瓟妗堬紝閮借涓?#8220;搴旂敤搴?#8221;鐨勫疄鐜頒細瀵艱嚧姝誨驚鐜紝鎴戦潪甯稿洶鎯戙傚弽澶嶇湅浜嗕腑鏂囩増鍜岃嫳鏂囩増錛岃寰楀ぇ瀹惰繖鏍瘋涓哄彲鑳芥槸涔︿腑璇磍isp鐨勫疄鐜版槸“搴旂敤搴?#8221;錛岃屽湪scheme涓窇榪欐浠g爜浼氭寰幆錛屽氨鍏堝叆涓轟富鐨勮涓?#8220;搴旂敤搴?#8221;鐨勫疄鐜頒細姝誨驚鐜傚叾瀹炲鐓ф鏂囷紝鎴戜滑鍙互鐪嬪埌“姝e垯搴?#8221;鍋滄灞曞紑鐨勬潯浠舵槸“鍙寘鍚熀鏈繍綆楃鐨勮〃杈懼紡”錛岃屽浜?/span>
(define (p) (p))鏄棤璁哄浣曚篃娌℃硶瀹屽叏灞曞紑鐨勶紝鍥犱負瀹冧細涓嶆柇閫掑綊錛屾墍浠?#8220;姝e垯搴?#8221;鎵嶄細姝誨驚鐜?/span>
鑰屽浜?#8220;搴旂敤搴?#8221;鐨勫疄鐜幫紝鍒欎細榪欐牱灞曞紑
(test 0 (p))
(if (= 0 0) 0 (p))
(if #t 0 (p))
; 0
瑙e喅榪欎釜闂涓昏鏄?#8220;姝e垯搴?#8221;錛圢ormal order錛変互鍙?#8220;搴旂敤搴?#8221;錛圓pplicative order錛夊睍寮涓涓粍鍚堝紡鐨勮鍒欙紝浠旂粏鐮旂┒浜哅IT 6.001璇劇▼璁蹭箟錛岀綉涓婄殑鍚勭絳旀錛屼互鍙婁腑鑻辨枃鐗堛傛垜璁や負錛屾鍒欏簭浠ョ被浼煎箍搴︿紭鍏堢殑鏂瑰紡榪涜灞曞紑銆傝屽簲鐢ㄥ簭浼樺厛璁$畻瀛愯〃杈懼紡錛岀被浼間笌娣卞害浼樺厛銆傞偅涔堝浜庤繖涓棶棰橈紝姝e垯搴?/span>浼氬睍寮涓?/span>
=> (if #t 0 (p))
0
鑰屽簲鐢ㄥ簭錛岀敱浜?p)涓鐩村彲浠ラ掑綊浠f崲錛屼粠涓寮濮嬪氨浼氳繘鍏ヤ竴涓棤闄愰掑綊涓幓銆?/span>
綆璦涔嬶紝鐢變簬搴旂敤搴忕殑鍘熷洜錛屽湪 test 琛ㄨ揪寮?榪樻病鏈夊睍寮涓?if 鐗規畩褰㈠紡錛坰pecial forms錛夋椂錛?(p)宸茬粡闄峰叆浜嗘棤闄愰掑綊銆?
]]>
2 (if (< x 0)
3 (- x)
4 (x)))
]]>