2017-03-08 48 views
0

我現在教自己編程,我來到了一個被引入遞歸函數的點。我理解他們背後的基本原則,但每當我嘗試閱讀包含遞歸函數的代碼時,我都會遇到難以追查的問題。老實說,如果我不在紙上寫下整個功能並手動跟蹤它,我就不能真正理解它的功能,我不能在心理上跟隨它,就是我所說的。你能提供一些關於如何在精神上做到這一點的提示嗎?我非常聰明(智商117),也許這就是問題所在?提前致謝。正確閱讀遞歸函數

+0

遞歸是一個非常糟糕的工具,使用頻率太高。 – DwB

+0

練習,練習,練習。 –

+0

投票重新開放。這是一個關於如何最好地理解遞歸的有效問題。雖然答案將基於經驗知識,但情況往往如此,並不會使問題失效。 – rghome

回答

0

我認爲這是一個很好的問題。很多人犯了一個錯誤,試圖按照遞歸函數的調用棧,這是錯誤的方法。

我發現唯一的辦法是看看寫的是什麼,並問自己它是否在邏輯上是正確的,它是否會結束。如果這些事情是真的,它就會起作用,而且你不需要知道如何。

的詳細信息:

  1. 是否所有可能的輸入值考慮?
  2. 這些陳述在每種情況下都是真實的嗎?
  3. 有沒有(有)值(s)函數不會遞歸?
  4. 剩餘的所有輸入值是否最終導致該值?

例如(僞碼):

factorial(n): 
    if (n < 0) throw InvalidArgument 
    if (n == 0) return 1 
    else return factorial(n - 1) * n 

所有輸入值都包括在內。這些陳述是真實的。有一個值不會遞歸(< = 0),其餘所有值減1,直到達到退出值。因此,它的工作。

你當然可以在你的想法中犯錯誤。一個好的智商確實對此有所幫助,並且您可能需要在某個時候使用追蹤或調試來檢查您的假設並在邏輯中找到錯誤,但這不應該是第一種方法。

這就是遞歸解決方案的美妙之處:它們傾向於陳述事實而非程序性指示!

+0

謝謝,先生。所以,基本上,我不是那麼愚蠢,我只是用錯了方法,對吧? –

+0

是的 - 的確如此!在這種情況下要做的聰明的事情是理解算法的基本正確性,而不是嘗試和追蹤每個執行路徑。如果您認爲它有價值,請提高答案。 – rghome

0

我認爲智商並不重要。無論如何,我認爲這都是關於練習。嘗試寫一些遞歸函數。經過大量的練習和經驗,你會發現它更容易理解。

有一些good ideas。 祝你好運。