SICP習題 1 12 解題總結

2021-09-01 19:48:14 字數 1890 閱讀 4679

sicp 習題 1.12 要完成的工作是帕斯卡三角,有沒有覺得「帕斯卡」這三個字很熟悉呀,在你人生知識水平的最高點上你應該接觸過他,不過現在你可能忘了。

人家還是個散文家!! 牛人就是牛人,完全無視我等庸才地存在著。

所謂帕斯卡三角就是像下面這樣的三角型:

1 1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

注意我這裡的排列方式和書中的不一樣。書中是乙個正立的等腰三角型的樣子,所以可以說每個數是它上面兩個數的和。

我這裡將帕斯卡三角形向左對齊了,所以我這裡每個數等於它左上方和正上方兩個數的和。

我這樣做不是為了偷懶,不是覺得這樣排版簡單,是因為這樣比較容易對應上資料模型。

如果是按書中的排列方式,我們怎麼定位每乙個數呢,按行號和列號編排的話,第一行的第乙個數應該算是number(1,1),既然是number(1,1),不如就將它放到第一排的第一列,不要放在一行的中間了。

然後就是對於number(x,y)中x和y的約定,我使用的是以左上角為原點,x軸向右,y軸向下的座標系,不好意思,做視窗繪製做多了,習慣使用這樣的座標系。

也就是說number (3,4)是指的由上往下第4排的第3列。

好,接著就是如何求帕斯卡三角形某乙個位置上的數,我定義的過程如下,沒有做太多呼叫引數的判斷,使用的時候需要小心一點,不要用錯引數。

(define (pascal-recrusive-element x y)

(if (= x 1) 1

(if (= x y) 1

(+ (pascal-recrusive-element x (- y 1)) (pascal-recrusive-element (- x 1) (- y 1))))))

求以上結果使用的還是遞迴方法,求某乙個位置的數就通過求它左上方"(x-1)(y-1)"和正上方「(x) (y -1)」的數來得到,一直遞迴求值。

完成以上工作以後我們覺得還有好多事情要做,就是求得每一行的每乙個數,將它們按正確的方式列印出來。可能是做以前的c程式設計題做的太多,習慣了這個方式。

後來我全做完了去網上查答案,發現很多人做到我這步就算成功了,根本沒有去求完整的帕斯卡三角形,可惜是做完了才發現這一點,不然可以省點時間。

既然已經做了,就和大家分享一下,我先是做了乙個pascal-recrusive-line過程,用來列印某一行帕斯卡數,過程如下:

(define (pascal-recrusive-line x n)

(format #t " ~s " (pascal-recrusive-element x n))

(if (> x 1)

(pascal-recrusive-line (- x 1) n)))

然後又做了乙個pascal-recrusive過程,用來迭代指定數量的行,過程如下:

(define (pascal-recrusive n)

(if (> n 1)

(pascal-recrusive (- n 1)))

(pascal-recrusive-line n n)

(format #t "~%"))

不知道大家有沒有留意我的過程名使用的是recrusive,既然有recrusive版本的實現,應該有迭代版本的實現吧。

我真做了乙個,因為這個帕斯卡數確實有迭代解,我用迭代方式算出每一行的帕斯卡數,記錄在乙個列表裡,將這些列表又儲存在乙個大的列表裡形成乙個型別二維陣列的東西來記錄產生的帕斯卡數。

做的函式不是很漂亮,就不在這裡現眼了,大家有時間可以去試試做乙個迭代版本的帕斯卡三角形生成函式。

SICP 習題 1 14 解題總結

sicp 習題 1.14要求計算出過程count change的增長階。count change是書中1.2.2節講解的用於計算零錢找換方案的過程。要解答習題1.14,首先你需要理解count change的工作方式,要理解count change的工作方式,最好是自己去實現一遍count chan...

SICP 習題 1 22 解題總結

sicp 習題 1.22 要求改進題中列舉出來檢查素數的過程,用來求1000,10000,100 000,還有1000 000附近的素數,然後比較求這些素數的時間,看是否符合 n 的複雜度。要完成這道題首先要將題目中列出的過程照抄到你的scheme環境中。因為書中的 使用了 runtime 過程,我...

SICP 習題 1 25 解題總結

sicp 習題 1.25 就是我上面說過的傷自尊的題了。習題1.25說到有個叫allyssa p.hacker的人說expmod過程完全沒有必要搞那麼麻煩,直接使用前面的fast expt過程和remainder過程就好了,她 叫alyssa的應該是女的吧 覺得可以這樣定義expmod define...