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進行學習。之所以寫部落格,第 一 是想勉勵自己不斷學習,讓大家監督 第 二 ...