SICP 1.21 1.22 體會

1.21 簡單的將書上代碼敲了一遍, 很順利就過了。

1.22 就悲劇了。

         先按書本的意思,代碼很快就寫完了。但計算的時間在機子上漂浮不定, 3-5倍之間。

         代碼如下:

(define (search-for-primes start end count)
    (define (timed-prime-test n)
(newline)
        (display n)
(start-prime-test n (runtime)))
    (define (start-prime-test n start-time)
(if (prime? n)
   (report-prime (- (runtime) start-time))
   0))
    (define (report-prime elapsed-time)
(display " *** ")
        (display elapsed-time)
1)
    (define (prime? n)
(= n (smallest-divisor n)))
    (define (search-iter start end count)
(if (or (> start end) (= count 0))
   0
   (if (= (timed-prime-test start) 1)
(search-iter (+ start 1) end (- count 1))
(search-iter (+ start 1) end count))))
    (search-iter start end count))


      問題就悲劇在,我想換一種想法。

     一般常見的工程測試代碼都是如下風格:

記錄開始時間

        調用函數

        計算結束時間

    於是,我很悲劇地寫了下面代碼

   (print-test-time   (runtime)  (search-iter start end count)  (runtime))

   卻驚奇的發現前後2次計算的時間居然完全一樣。

   再認真將書從頭看了一遍, 我暈, 這本書最重要的東西居然沒講。 函數的參數到底按什麼順序求的?

  google了一下,暈, 居然是依賴編譯器確定。 也就是說不知道。

  對於一般狀態無關的參數的確沒有問題。 但對於時間依賴的參數就悲劇了。

  再回過頭來思考計算模型, 發現這本書更大的問題。 對什麼東西能做操作符,什麼東西能做操作數居然完全沒有給出清晰的定義。

  1和1.0, 1/1, true, 到底是不是一回事,書本也完全沒講清楚。

  作爲講編程語言的書來說, 這本書真是一塌糊塗。

 

 上面的函數 (timed-prime-test n) 有3個語句, 概念進入得很突入, 這3個語句執行按什麼順序呢? 返回值是哪個呢? 基本上靠讀者去猜。

(本人猜的是從上往下執行,返回最後一個語句 ,但是不是程序確實是這樣還不大自信)

(newline)
        (display n)
(start-prime-test n (runtime)))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章