SICP讀書筆記1 練習1 22的思考

2021-07-08 19:53:38 字數 1798 閱讀 1915

1.對於沒有賦值語句的程式如何實現引數改變

(1)遞迴呼叫改變引數

比如,我要實現檢驗輸入的引數begin是乙個偶數還是奇數,如果是奇數進行下一步,如果是偶數就+1將其設定為奇數。

程式如下:

(define (search-for-primes begin counter)

(if (= (remainder begin 2) 0)

(search-for-primes (+ begin 1) counter)                        ----------------①

(start-test begin counter (runtime))))

這裡將begin+1的目的是①中遞迴呼叫search-for-primes函式實現的,因為這裡還沒有學到scheme的賦值語句。

如果可以像c++一樣對形式引數直接賦值,程式完全就能改地更清晰:

(define (search-for-primes begin counter)

(change-to-odd begin)

(start-test begin counter (runtime)))

(define (change-to-odd x)

(if (= (remainder x 2) 0)

(+ x 1)

x))可惜的是,沒有賦值的時候,(change-to-odd begin)不能直接改變begin的值,當然我們可以有其他辦法。

(2)仍然要借助函式呼叫才能實現,不過不需遞迴了。

(define (search-for-primes begin counter)

(start-test (change-to-odd begin) counter (runtime)))                    -------------②

(define (change-to-odd x)

(if (= (remainder x 2) 0)

(+ x 1)

x)) 如②中所示,由於change-to-odd函式可以返回改變成的值,我們可以這樣使用。

當然也可以採用這種方式。

(define (search-for-primes begin counter)

(define new-begin (change-to-odd begin))

(start-test new-begin counter (runtime)))

注:之所以能夠像(2)這樣,是因為整個函式的其他功能還是要靠start-test這個函式實現,並且有乙個與search-for-primes相同的引數。

所以有(2)這樣的方式,但是如果沒有這種情況要實現上述目標,就只有通過先判斷然後改變引數遞迴呼叫search-for-primes實現了。

2.將只需進行一次的操作與其餘操作分離

整個search-for-primes的功能是給定乙個初始值begin,以及個數counter

給出從begin開始的counter個素數。

由於素數除了2之外肯定是奇數,所以沒必要每次再去呼叫(prime? ),在確保其實奇數之後,每次增加2,就可以確保每次只檢測奇數了。

(define (search-for-primes begin counter)

(if (= (remainder begin 2) 0)

(search-for-primes (+ begin 1) counter)                     

(start-test begin counter (runtime))))

所以可以先對於begin進行處理,將之後的功能封裝到另乙個函式中。

讀書筆記(二) SICP

1.3.1 formulating abstractions with higher order procedures 讀了兩三遍才明白higher order procedure是什麼。乙個固定的procedure形成了乙個固定的pattern,這些patterns我們可以通過用abstracti...

SICP讀書筆記 3 4

讓我們舉起杯,祝福那些將他們的思想鑲嵌在重重括號之間的lisp程式設計師 祝我能夠突破層層 找到住在裡計算機的神靈!1.構造過程抽象 2.構造資料抽象 3.模組化 物件和狀態 4.元語言抽象 5.暫存器機器裡的計算練習答案 在引入賦值後,迫使我們需要關心事件發生的順序,從而引發了併發的問題 限制並行...

讀書筆記 1

從我第一次看到windows就對它那花花綠綠的外表所吸引,大學兩年過來,時間又讓我從另乙個角度重新認識的了這些美麗的。本學期開始圖形程式設計的學習,探索windows圖形系統,並對gdi api,directdraw api進行學習。之所以寫部落格,第 一 是想勉勵自己不斷學習,讓大家監督 第 二 ...