簡體   English   中英

為什么這會導致無限循環 [SICP]?

[英]Why does this result in an infinite loop [SICP]?

我正在解決 SICP 的一個問題。 我不確定為什么這個 function 會導致無限循環。 有人可以對此有所了解嗎? 我確信可能有更好的方法來編寫這個循環,但我是函數式編程的新手,並且仍然試圖圍繞編寫這樣的循環。

(define (search-for-primes a b)
        (if (> a b) (display " Done"))
        ((timed-prime-test a) (search-for-primes (+ a 1) b)))

該程序一直為這個輸入打印“完成”:(search-for-primes 2 10),這是沒有意義的。 'timed-prime-test' 是一個 function,它檢查輸入是否是素數。 或不。 這就是我的想法:程序一直調用自己,直到 a = 11,此時它會退出。 然而,即使對於前 9 次迭代(a=2 到 a=10),我也沒有看到來自“定時-prime-test”function 的 output,這表明控制甚至沒有到達第二行,但是如何function 調用是無限次發生的嗎?

編輯:我再次查看書中“if”的語法,我注意到兩件事:a)“替代”是我的代碼在 if 塊之外,這是錯誤的。 我解決了這個問題,但程序 output 用於 a = 10。b)腳注說它應該只有單個表達式。 我的程序的這種行為是否與 b) 有關? 如果是,在這種情況下程序執行是如何發生的?

如果您正確格式化代碼,答案將立即清晰。 這就是正確格式化代碼很重要的原因 這是您的定義,格式更好:

(define (search-for-primes a b)
  (if (> a b)
      (display " Done"))
  ((timed-prime-test a) (search-for-primes (+ a 1) b)))

所以, (search-for-primes 1 1)

  • 測試 1 是否大於 1……不是;
  • 然后開始評估((timed-prime-test a) (search-for-primes (+ a 1) b)) ,這樣做:
    • 以某種順序評估(timed-prime-test 1)(search-for-primes 2 1) ,這至少意味着評估(search-for-primes 1 1) ,其中:
      • 測試 2 是否大於 1... 它是
        • 所以它打印“完成”;
      • 然后開始評估……哎呀。

現在應該很明顯問題出在哪里了。

((timed-prime-test a) (search-for-primes (+ a 1) b))

(search-for-primes (+ a 1) b)的遞歸調用的當前延續是((timed-prime-test a) _)但它永遠不會到達_因為你永遠不會填充它的值,即_bottom type 所以((timed-prime-test a) _)的值也是一個底部。

但是search-for-primes的值是((timed-prime-test a) _)的值。 所以它沒有價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM