SICP練習 25 練習1 31

2021-09-23 23:29:36 字數 1462 閱讀 4980



練習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是要...