(sicp 電腦程式的構造和解釋) 如何理解無限長的流?

時間 2021-05-11 17:55:56

1樓:窗戶

每次都展開計算一下,往前推一步,完全可行阿。

;利用函式構造惰性計算

(define-syntax

xcons

(syntax-rules

()((

xconsab

)(cons

(lambda ()a

)(lambda ()b

)))))

(define-syntax

xcar

(syntax-rules

()((

xcarx)

((car

x)))))

(define-syntax

xcdr

(syntax-rules

()((

xcdrx)

((cdr

x)))))

;無限流

(define

(make-inf-streamn)

(xconsn(

make-inf-stream(+

n1))))

;列印流

(define

(display-stream

stream)(

if (

null?

stream)(

void)(

begin

(display

(xcar

stream))(

newline)(

display-stream

(xcdr

stream

)))))

;列印一下無限流試試

(display-stream

(make-inf-stream0))

以上可以構造樹狀惰性,如果只要list

(define-syntax

xcons

(syntax-rules

()((

xconsab

)(cons a(

lambda ()b

)))))

(define-syntax

xcar

(syntax-rules

()((

xcarx)

(car

x))))

(define-syntax

xcdr

(syntax-rules

()((

xcdrx)

((cdr

x)))))

把上述這段巨集替代之前的,你可以看到一樣的效果

2樓:ayanamists

(define

int(

lambda(x

)(stream-consx(

int(+ x

1)))))

(stream->list

(int0))

你要是像上面這樣寫,那毫無疑問它會無限迴圈,記憶體也會爆掉;但是在現實問題中,我們不需要把整個流展開啊。。。比如說

(define

int(

lambda(x

)(stream-consx(

int(+ x

1)))))

(define

func

(lambda(x

)(if (

>(stream-firstx)

10)'()

(cons

(stream-firstx)

(func

(stream-rest

x))))))

(func

(int0))

這會得出:'(

0123

4567

8910)

這不就沒問題了嘛。

你從上面這個例子就看出來了,由於惰性求值的存在,流可以無限長,但在現實的計算機裡,流不可能被無限地展開。真正限制了流長度的不是它本身,而是你對他的展開。

《電腦程式的構造和解釋(SICP)》討論的核心問題是什麼?

做夢都想進位元組 我來吐槽下我還沒有看完。看到第二章感覺就是把一些簡單演算法拿lisp寫一遍,lisp看多我快吐了,要是拿scala寫該多好。 三十二 我覺得SICP的核心問題就是,如何通過抽象的方式降低軟體系統設計的複雜度。這本書最大的問題在於,你必須得預設你讀這本書的時候什麼東西都沒學過 畢竟一...

怎樣讓父母理解電腦的構造?

蘇河 最早的時候我是這麼理解的,現在想想其實並不是很準確,但是能讓對電腦一點不懂的人開始有個初步的認識。電腦就好比乙個加工廠,cpu就是生產車間,硬碟是倉庫,記憶體是連線倉庫跟生產車間的通道。工作過程可以這麼理解 原料從倉庫運輸運輸到車間,要經過通道,所以cpu 越好,表示車間生產效率高,但是如果通...

如何解釋列印自己的程式?

時國懷 先按行分解開,這個程式一共有6行 charb 0x22 charn 0xa char c char b 0x22 char n 0xa char c c s c main main 前面定義了三個變數,後面是main函式裡乙個輸出。然後把輸出裡的printf展開,把c和b都替換成具體的值 p...