锘??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ēng)殑錛屽浜庝竴涓泦鍚堢殑鎵鏈夊瓙闆嗙殑闆嗗悎錛屽彲浠ュ垎涓轟袱閮ㄥ垎錛屽惈鏈夌涓涓厓绱犲拰涓嶅惈絎竴涓厓绱犵殑闆嗗悎銆傝屼笖鍚涓涓厓绱犵殑鎵鏈夊瓙闆嗛櫎鍘葷涓涓厓绱狅紝鎭板ソ姝f槸鎵鏈変笉鍚涓涓厓绱犵殑瀛愰泦銆?/span>
涔熷彲浠ユ崲涓濊礬錛屽浜庨泦鍚圓錛岃瀹冨彲浠ヨ〃紺轟負(fù) (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
絎竴縐嶆瘡嬈″彇鍑洪鍏冪礌騫蟲(chóng)柟鍚庡墠鎻掑埌鏂拌〃錛岃薄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))
騫沖潎闃誨凹娉曞拰涓嶇敤騫沖潎闃誨凹鍒嗗埆濡備笅錛屽畠浠鏁板垎鍒負(fù) 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媯(gè)鏌ワ紝鍥犱負(fù)鍏鋒湁log n 鐨勫闀塊樁錛屾墍浠ュ浜?n^2 鍜?n 鐨勬鏌ョ殑鏃墮棿姣?鐞嗚涓婂簲璇ユ槸 2錛?錛?瀹為檯涓婏紝緇忚繃嫻嬭瘯涔熸瘮杈冩帴榪戯紝褰搉姣旇緝澶ф椂銆?br>鑻ヤ笌棰勮涓嶇錛屽彲鑳藉洜涓?n 姣旇緝?yōu)畯锛屾垨鑰呭瓧闀垮彂鐢熷彉鍖栵紝姣斿 n > 2^32 錛堝弬瑙佷笅棰橈級(jí)
1.25
浠呬粠鐞嗚鍒嗘瀽錛孉lyssa 鐨勬敼鍔ㄤ笉浼?xì)寮曡捣澧為晧K樁鐨勫彉鍖栵紝浣嗗疄闄呬笂褰?Fermat 媯(gè)鏌ョ殑 n 紼嶅井澶т竴鐐癸紝閫熷害灝變細(xì)寰堟參銆備富瑕佸師鍥?灝辨槸 base^exp 鏄竴涓潪甯稿ぇ鐨勬暟錛屽彲鑳借繙榪滆秴榪?涓涓?2浣嶆満瀛楃殑琛ㄧず鑼冨洿 2^32 錛屽湪 scheme 閲屽彲鑳界敤鑻ュ共涓?32-bit 闈犺蔣浠跺疄鐜拌繍綆楋紝榪欏皢瀵艱嚧璁$畻鎬ラ熷闀褲傛棤璁烘槸浼犻掋佽繍綆楄繕鏄眰妯°?br>瀹為檯涓?1.22銆?.23銆?.24 鐨勫嚑涓鐩彲鑳介兘浼?xì)閬囧埌瀛楅暱鍙樺寲寮曡碉L(fēng)殑璁$畻閫熷害紿佸彉銆?br>
1.26
Fermat 媯(gè)鏌ユ鏄洜涓?榪炵畫(huà)姹傚鉤鏂圭殑姹傚箓鏂規(guī)硶錛屼嬌寰楃殑澧為暱闃跺彉?shù)?log n錛?鑰岃繖鍧囨潵婧愪簬 b^(2n) = (b^n)^2錛?/span>Louis 鐨勬柟娉曡姹傚箓鍙堝彉鎴愪簡(jiǎn)榪炰箻錛宐^(2n) = b^n*b^n = (b*b*...*b)*(b*b*...*b)錛屾眰騫傜殑澧為暱闃跺彉鎴愪簡(jiǎn) O(n)錛孎ermat 媯(gè)鏌ョ殑澧為暱闃惰嚜鐒朵篃鍙樻垚浜?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 灝忓畾鐞嗙殑涓涓彉褰細(xì)
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
榪欎釜鍙樺艦灝辨槸棰樼洰涓彁鍒扮殑錛岃繖涓艦寮忓拰璐歸┈灝忓畾鐞嗘槸絳変環(huán)鐨勶紙浣嗘槸濂囨殑鏄紝鎴戞病鏈夊彂鐜板凡鐭ョ殑鍑犱釜Carmichael鏁拌兘澶熻翰榪囪繖涓彉褰㈢殑媯(gè)鏌ワ紝鏈夊緟鐮旂┒鈶?/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妯鐨勫鉤鍑″鉤鏂規(guī)牴錛?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 銆傚彲浠ョ▼搴忛獙璇佽繖涓?鎵浠ユ垜璁や負(fù)錛?/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 |
|------+--------+--------+-------|
浠庝笂琛ㄥ彲浠ョ湅鍑猴紝闄や簡(jiǎn)鍓嶄袱鍒椾箣闂達(dá)紝鍚庡垪鐨勬暟瀛楅兘鏄墠鍒楁暟瀛楃殑 3 鍊嶅乏鍙籌紝榪戜技浜?√10 鈮?3.16銆傚疄闄呬笂錛岄殢鐫 n 鐨勪笉鏂澶э紝榪欎釜鏁頒細(xì)閫愭笎閫艱繎 √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) 宸﹀彸錛屽彲鑳藉師鍥犳槸鍏跺畠鐨勮綆楅渶瑕佹椂闂達(dá)紝浣嗗綋 n 涓嶆柇澧炲ぇ錛屽叾瀹冭綆楁槸甯告暟闃訛紝榪欎釜姣斿間細(xì)涓嶆柇鎺ヨ繎2銆?br>
]]>
涓嬮潰鐢?% 琛ㄧず榪囩▼ remainder錛岄偅涔堟鍒欏簭鐨勮繃紼嬪涓嬶細(xì)
(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>
搴旂敤搴忚綆楄繃紼嬪涓嬶細(xì)
(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)))))
]]>
璁$畻榪囩▼鐨勬爲(wèi)濡備笅錛?br>
寰堝鏄撶湅鍑猴紝璁$畻榪囩▼鐨勭┖闂撮渶姹傦紝涔熷氨鏄爲(wèi)鐨勬繁搴︼紝鍙栧喅浜庢渶宸﹁竟鐨勫瓙鏍?wèi)锛屽?n 1)錛屽畠鐨勬繁搴︽槸n+6錛孫(n).
鐒跺悗瀵逛簬璁$畻姝ユ暟錛屼篃灝辨槸鏍?wèi)鐨勮妭鐐规晭图屾垜浠煡閬撳浜庝竴涓簩鍙夋爲(wèi)錛屾爲(wèi)鐨勮妭鐐規(guī)暟 = 宸﹀瓙鏍?wèi)鑺傜傄?guī)暟 + 鍙沖瓙鏍?wèi)鑺傜傄?guī)暟 + 1.
鍏堟潵鐪?(n 1) 瀛愭爲(wèi)錛岃瀹冪殑鑺傜偣鏁版槸f(n), 鑰屼笖鎬繪湁錛岄潪鍙惰妭鐐瑰乏瀛愭爲(wèi)鑺傜偣鏁頒負(fù)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) 瀛愭爲(wèi)錛岃瀹冪殑鑺傜偣鏁?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鐨勬鏁幫細(xì)
瀵逛簬a錛岃皟鐢ㄦ鏁皌錛岄偅涔?a*3^(-t) < 0.1 , 鍗?10a < 3^t ==> lg(10a)/lg3 < t,
鎵浠ュ闀塊樁 絀洪棿鍜屾椂闂?閮戒負(fù) O(log a)
]]>
閫掑綊璁$畻榪囩▼涓?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
涓枃鐗堝師棰樼炕璇戞湁璇紝搴斾負(fù)璁$畻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 鑻辨枃鐗堜笂鍙互鎼滅儲(chǔ) 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
>
鍥犱負(fù) guess^2 < c + x
, 褰?x < c 鏃訛紝guess 灝辨洿澶氱殑渚濊禆浜?c 浜?jiǎn)銆?br>
瀵逛簬鐗瑰埆澶х殑鏁幫紝鐢變簬嫻偣鏁板湪鐗瑰埆澶ф椂錛岀鏁fч潪甯告槑鏄撅紝鐩擱偦鐨勪袱涓暟涔嬮棿鐨勫樊璺濅細(xì)闈炲父澶э紝瀵艱嚧 |guess^2 - x| 濮嬬粓 澶т簬 c錛岃綆椾究榪涘叆浜?鏃犻檺寰幆銆?br>
姣斿璁$畻 (sqrt 1e300)
浣跨敤鍙樺寲鐜囨敼榪涘悗鐨勪唬鐮佸涓嬶細(xì)
(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 騫朵笉浼?xì)銆?br>
姝ら鍚?.5
鍦?.5涓紝鐢變簬搴旂敤搴忕殑鍘熷洜錛屽湪 test 琛ㄨ揪寮?榪樻病鏈夊睍寮涓?if 鐗規(guī)畩褰㈠紡錛坰pecial forms錛夋椂錛?(p)宸茬粡闄峰叆浜?jiǎn)鏃犻檺閫掑綊銆?br>
]]>
1.2
or
1.3
榪欎釜闂?shù)腑鏂囩増鐨劸樆璇戞槸閿欑殑锛屽弬鐪嬪師鏂囨槸姹傭q蟲(chóng)柟鍜岃屼笉鏄?#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鍦ㄧ綉涓婄湅浜?jiǎn)寰堝绛旀锛岄兘璁や?#8220;搴旂敤搴?#8221;鐨勫疄鐜頒細(xì)瀵艱嚧姝誨驚鐜紝鎴戦潪甯稿洶鎯戙傚弽澶嶇湅浜?jiǎn)涓枃鐗堝拰鑻辨枃鐗堝Q岃寰楀ぇ瀹惰繖鏍瘋涓哄彲鑳芥槸涔︿腑璇磍isp鐨勫疄鐜版槸“搴旂敤搴?#8221;錛岃屽湪scheme涓窇榪欐浠g爜浼?xì)姝诲惊鐜Q屽氨鍏堝叆涓轟富鐨勮涓?#8220;搴旂敤搴?#8221;鐨勫疄鐜頒細(xì)姝誨驚鐜傚叾瀹炲鐓ф鏂囷紝鎴戜滑鍙互鐪嬪埌“姝e垯搴?#8221;鍋滄灞曞紑鐨勬潯浠舵槸“鍙寘鍚熀鏈繍綆楃鐨勮〃杈懼紡”錛岃屽浜?/span>
(define (p) (p))鏄棤璁哄浣曚篃娌℃硶瀹屽叏灞曞紑鐨勶紝鍥犱負(fù)瀹冧細(xì)涓嶆柇閫掑綊錛屾墍浠?#8220;姝e垯搴?#8221;鎵嶄細(xì)姝誨驚鐜?/span>
鑰屽浜?#8220;搴旂敤搴?#8221;鐨勫疄鐜幫紝鍒欎細(xì)榪欐牱灞曞紑
(test 0 (p))
(if (= 0 0) 0 (p))
(if #t 0 (p))
; 0
瑙e喅榪欎釜闂?shù)富瑕佹?#8220;姝e垯搴?#8221;錛圢ormal order錛変互鍙?#8220;搴旂敤搴?#8221;錛圓pplicative order錛夊睍寮涓涓粍鍚堝紡鐨勮鍒欙紝浠旂粏鐮旂┒浜?jiǎn)MIT 6.001璇劇▼璁蹭箟錛岀綉涓婄殑鍚勭絳旀錛屼互鍙?qiáng)涓嫳鏂囩増銆傛垜璁や負(fù)錛屾鍒欏簭浠ョ被浼煎箍搴︿紭鍏堢殑鏂瑰紡榪涜灞曞紑銆傝屽簲鐢ㄥ簭浼樺厛璁$畻瀛愯〃杈懼紡錛岀被浼間笌娣卞害浼樺厛銆傞偅涔堝浜庤繖涓棶棰橈紝姝e垯搴?/span>浼?xì)灞曞紑涓?/span>
=> (if #t 0 (p))
0
鑰屽簲鐢ㄥ簭錛岀敱浜?p)涓鐩村彲浠ラ掑綊浠f崲錛屼粠涓寮濮嬪氨浼?xì)杩涘叆涓涓棤闄愰掑綊涓幓銆?/span>
綆璦涔嬶紝鐢變簬搴旂敤搴忕殑鍘熷洜錛屽湪 test 琛ㄨ揪寮?榪樻病鏈夊睍寮涓?if 鐗規(guī)畩褰㈠紡錛坰pecial forms錛夋椂錛?(p)宸茬粡闄峰叆浜?jiǎn)鏃犻檺閫掑綊銆?
]]>