2012-04-17 68 views
2

我只是在學習Ruby和一般的編程。我正在做一個二十一點計劃,作爲我的第一個項目。我有一個方法start_game被稱爲開始每一個新手。該方法被調用,然後在手結束時再次調用自己。這是做到這一點的正確方法嗎?在我看來,每次調用方法時都會無休止地分配內存。我不確定這是垃圾回收處理與否。我覺得可能有更好的方法來做到這一點,但無法弄清楚。提前致謝!Ruby中的遞歸。我是否正確地做這件事?

+1

「我已經包含了start_game方法的代碼。」 - 不,你沒有。 – 2012-04-17 09:00:55

+0

糟糕!忘了編輯出來。現在已經修復了。我覺得這不值得包括在內。 – Kevin 2012-04-17 09:35:35

+0

包含* some *代碼幾乎總是值得的 - 訣竅是能夠包含相關位。如果你不確定我是否會在包括太多的方面犯錯(但不要整個頁面長的程序粘貼,例如,沒有人會閱讀它。) – Russell 2012-04-17 10:03:49

回答

1

像這樣遞歸調用一個方法最終會導致堆棧溢出(如果有足夠的手牌,不知道它有多可能)。

除非,即尾巴呼叫優化防止這種情況發生。這是一種可以應用於遞歸方法調用的優化形式,其中遞歸調用始終是通過該方法的任何運行中最後要調用的東西。這基本上是將遞歸調用轉換爲循環,所以你最終不會每次都添加到堆棧中。

但是,根據這個question,你不能依賴Ruby中的尾部優化。所以我會重寫你的代碼,所以start_game在一個循環中被調用,該循環測試一些條件以決定是否應該繼續。

+0

謝謝羅素!我會試一試。 – Kevin 2012-04-17 09:36:51

+1

沒問題!享受學習Ruby - 您選擇了一門很好的語言來學習編程。 – Russell 2012-04-17 10:05:04

相關問題