2010-11-17 38 views
1

優化我有一個計劃功能誰的基本形式是這樣的我怎麼能知道我的尾遞歸方案功能被正確

(define (foo param var) 
    (cond ((end-condition) (return-something)) 
     ((other-end-condit) (return-something-else)) 
     (else 
     (let ((newvar (if some-condition 
          (make-some-updated var) 
          (destructive-update! var)))) 
      (foo param newvar))))) 

我覺得這是很清楚的東西,需要進行優化,以迭代編譯,但是當我編譯它(用雞)它仍然運行得非常慢。 (如果我理解R5RS規格:http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html,看起來應該是這樣)

我在python中編寫了一個while循環的精確算法,解釋程序在幾秒鐘內終止。我的編譯計劃大約需要15分鐘,我確信這個算法是一樣的。

我認爲這是一個尾部遞歸沒有得到優化的問題,因爲我想不出還有什麼可能,但我無法弄清楚。有任何想法嗎?對於它的價值,var是一個散列,破壞性更新僅僅是添加一個元素,儘管它也返回更新後的散列作爲newvar傳入。

+0

它可能是你的代碼的其他部分有一個隱藏的緩慢,但我也會嘗試不同的Scheme實現:Gambit和Bigloo是值得嘗試的兩個編譯器。 – erjiang 2010-11-18 03:33:51

+0

我可能會這樣做,謝謝 – 2010-11-18 04:34:47

回答

4

該函數確實是尾遞歸的,所以你很好。但是,尾遞歸意味着堆棧空間不會增長,並不是說程序保證運行速度很快。如果你想看看你的程序是否真正以尾遞歸方式運行,那麼在運行它的同時觀察Chicken所佔用的總內存(並確保你沒有在make-some-updated中分配內存,你可能會這樣做)。如果內存增長,那麼雞沒有按照標準正確編譯你的程序。

+3

另一件嘗試的是DrRacket - 您可以輸入代碼並點擊「校驗語法」按鈕 - 然後將鼠標懸停在表達式上將顯示指示尾部位置的粉紅色箭頭。 – 2010-11-17 17:19:57

+0

啊。我認爲除了節省堆棧空間之外,tail-call opts還提高了速度。感謝您的澄清。現在我只需要弄清楚我的速度在哪裏呢? – 2010-11-17 19:18:24