練習1.31
題目中已經說的很清楚了,product用來返回在給定範圍中各點的某個函式值的乘積。我們驚奇的發現這和前面的sum有著很大的相似,無非是將加法換成了乘法:
(define (product term a next b)
(if(> a b)
1(* (term a)
(product term (next a) next b))))
既然在上一道習題中已經得出了sum的迭代版本,在這裡同樣也可以將它寫成迭代的。
(define (product term a next b)
(define (product-iter a other)
(if (> a b)
other
(product-iter (next a)
(* (term a) other))))
(product-iter a 1))
不怕被笑話,我還去查了factorial的中文意思。有了product來寫factorial不要太容易呀,只不過要借助以下很久之前用到過的lambda。不過完全也可以用額外定義的函式實現同樣的功能,只不過在函式內用lambda會使**更加簡潔。
(define (factorial n)
(product (lambda (x) x) 1 (lambda (x) (+ x 1)) n))
下面我們來測試一下這個函式。
暈倒。。。博主輕飄飄的來了乙個(factorial 50)結果返回了半個螢幕寬的數字。
話說我寫到這裡的時候才把a題做完,b題都沒有看,沒想到居然不知不覺中把b也碰巧做了。不過再看看原來a還沒有寫完,還要求pi的近似值。
那麼這部分的策略是將分子和分母分開來看。先來看分子,我們可以準備乙個函式,有乙個引數n,如果n是1則返回2,n是奇數則加上1,n是偶數則加2。分母也可以用這種函式來產生。然後我們將左式中的4乘到右式,並且通過前面學的exact->inexact將分數轉換成浮點數。最後我們就求出了pi。下面是完整的**。
(define (get-pi n)
(define (get-numerator a)
(cond((= a 1) 2)
((odd? a) (+ a 1))
(else(+ a 2))))
(define (get-denominator b)
(cond ((odd? b) (+ b 2))
(else (+ b 1))))
(define (add1 c)
(+ c 1))
(* 4(exact->inexact(/ (productget-numerator 1 add1 n)
(product get-denominator 1 add1 n)))))
如是,我們再來檢測檢測。
(get-pi 300)
;value: 3.1467982645089903
引數n越大,計算得到的pi越精確。
SICP練習 25 練習1 31
練習1.31 題目中已經說的很清楚了,product用來返回在給定範圍中各點的某個函式值的乘積。我們驚奇的發現這和前面的sum有著很大的相似,無非是將加法換成了乘法 define product term a next b if a b 1 term a product term next a ne...
SICP練習 46 練習2 5
練習2.5 這道題的意思是有乙個新的cons,其接受兩個引數a b,並且返回 2 a 3 b 這個比較容易實現了。define cons a b expt 2 a expt 3 b cons 2 2 value 36 根據題中的意思,並將其與car和cdr模擬,得知car是要分離出2 a,cdr是要...
SICP練習 46 練習2 5
練習2.5 這道題的意思是有乙個新的cons,其接受兩個引數a b,並且返回 2 a 3 b 這個比較容易實現了。define cons a b expt 2 a expt 3 b cons 2 2 value 36 根據題中的意思,並將其與car和cdr模擬,得知car是要分離出2 a,cdr是要...