對scheme的一些理解(3)

2022-05-01 08:33:06 字數 1148 閱讀 6089

斷斷續續讀到sicp第三章,覺得scheme有點入門了,不過長久不練習,腦子又不能適應函式式程式設計模式了,覺得3.17、3.18、3.19還比較有意思,貼個自己的解題思路吧。

3.17

(define (count-unique-pair x)

(let ((db (cons 0 0)))

(define (count-pair x)

(define (add-unique-pair x db1)

(define (add-record db0 x)

(set-car! db0 x)

(set-cdr! db0 (cons 0 0))

x)(define (find-record x db0)

(if (not (pair? (car db0)))

(add-record db0 x)

(if (eq? x (car db0))

'()(find-record x (cdr db0)))))

(find-record x db1))

(if (not (pair? x))

0(if (null? (add-unique-pair x db))

0(+ (count-pair (car x))

(count-pair (cdr x))

1))))

(count-pair x)))

(define xx '(a b))

(define z1 (cons xx xx))

(define z2 (cons '(a b) '(a b)))

(count-unique-pair z1)

實現比較醜陋,基本還是過程式程式設計,使用了乙個db儲存已經遍歷過的pair,可以對付帶環的表,而且只要此pair已經遍歷過,則其子pair也不在遍歷了。相比一下純函式式寫法,這種方式還是比較清晰且容易理解的,不過存在記憶體競爭問題,不能並行執行。

3.18

此題簡化了一些,不用考慮car的環,使用3.17的儲存做法就ok了。

3.19

這個需要個小trick,要空間常量,意味著不能儲存已遍歷的pair指標,那我就用時間換空間吧,使用兩個指標,a指標一次步進1個pair,b指標一次步進2個pair,如果存在環,b指標會再次追上a指標,每次步進判斷指標是否相等就可以知道是否帶環了:)

對Linux inode的一些理解

檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...

對棧的一些理解

之前總結過一篇有關函式棧幀的部落格 函式棧幀以及呼叫約定相關的一些總結 但是感覺自己還是有一點知識點沒有弄懂,今天中午跟郭哥吃過飯一起 有關殼的問題的時候,順便把這個問題請教了一下郭哥,終於弄明白了,在此要特地感謝他,這裡把一些心得體會寫出來 先看一幅圖 選自ida權威指南 注意圖中是基於esp的棧...

對EK的一些理解

首先是網路流問題的提出 乙個源點,乙個匯點,不斷又源點向匯點輸送,其中路徑上有最大速度,求匯點收貨的最大速度是多少。在求之前可以先模擬一下過程如果源點現在只能出乙個單位的貨,那麼他會找乙個未達到最大速度的路進行運輸,接著我們不斷將運輸的量放大,即不斷地從起點開始尋找增廣路,每次都對其進行增廣,直到源...