[英]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)
:
((timed-prime-test a) (search-for-primes (+ a 1) b))
,這樣做:
(timed-prime-test 1)
和(search-for-primes 2 1)
,這至少意味着評估(search-for-primes 1 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.