遞歸詳解

我認為可以將遞歸函數(shù)分為兩種情況,一種是有返回值的,一種是沒有返回值的(僅做結(jié)束遞歸用),我分別給起了名字,有返回值的叫尋找初心,無返回值的叫開枝散葉。下面分別討論一下。

有返回值,尋找初心

大家很愛使用斐波那契數(shù)列做例子,那我也不例外,但是也有例外的地方。一般直接寫出如下代碼:

def dfs(n):
    if n == 1 or n == 2:
        return 1
    return dfs(n - 1) + dfs(n - 2)

其實這樣并不利于理解,因為這是理解這個遞歸之后的人寫出的代碼。那怎么樣寫可以理解起來簡單一些呢?先給出代碼,稍后給出解釋。

def dfs(n):
    if n == 1 or n == 2: #3 搜索尋得初心,返回
        return 1 #3 搜索尋得初心,返回
    a = dfs(n-1) #1 知道它會接著往下搜索即可
    b = dfs(n-2) #1 知道它會接著往下搜索即可
    res = a + b #2 不想遞歸,只要我知道了a+b,就是我要的結(jié)果
    return res 

我認為寫出這個代碼,應(yīng)該是這樣的思路。

  • 一開始你定義好了一個函數(shù)dfs,輸入n,返回斐波那契數(shù)列的第n個數(shù)字res。
  • 根據(jù)斐波那契數(shù)列的性質(zhì)你會想,要是知道第n-1和第n-2個數(shù)字就好了,可惜并不知道,但是好像可以使用剛才定義的函數(shù)表示為dfs(n-1)和dfs(n-2)。
  • 這樣表示可以嗎?好像表示完了還得知道第n-3和第n-4個數(shù)字,這樣寫的話,這個函數(shù)就會一直往下找哎,還得知道第n-5和第n-6個數(shù)字。
  • 如果它能一直往下找也挺好的哎,我知道數(shù)列的前幾個數(shù),找到最后沒準兒可以哎。
  • 那么需要知道數(shù)列前幾個數(shù)呢,好像知道一個不行,因為dfs(3) = dfs(2) + dfs(1),如果只知道dfs(1),那dfs(2)還會繼續(xù)往下找,dfs(2) = dfs(1) + dfs(0),dfs(0)不知道,繼續(xù)往下找,接下來更沒有知道的了。那兩個可以嗎?好像可以,按剛才的思路,有兩個的話,就不用繼續(xù)往下找了。
  • 那我們在函數(shù)每次往下找的時候判斷一下好了,如果是找數(shù)列第一個數(shù)和第二個數(shù),就返回1。至此,初心找到了,這個函數(shù),好像差不多了。你應(yīng)該是有點兒懵,但是也有點懂了的感覺。

無返回值,開枝散葉

簡單理解一下,就是利用遞歸,實現(xiàn)排列和組合。先只給出排列的例子:

# 排列 permutation
def dfs(self, result, nums, path):
    if not nums:
        result.append(path)
        return # 沒有返回值,只是為了停止遞歸
    for i in range(len(nums)):
        self.dfs(result, nums[:i] + nums[i+1:], path + [nums[i]])

nums = [1,2,3]
result = []
self.dfs(result, nums, [])
return result
# [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

這個其實只要關(guān)注path就可以清楚理解遞歸干的事兒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文首發(fā)于 LOGI'S BLOG,由作者轉(zhuǎn)載。 遞歸是一種應(yīng)用十分廣泛的編程技巧,很多數(shù)據(jù)結(jié)構(gòu)和算法都可用遞歸實...
    Ridiculous_one閱讀 1,099評論 0 0
  • 什么是遞歸?具體來講就是把規(guī)模大的問題轉(zhuǎn)化為規(guī)模小的相似的子問題來解決。在函數(shù)實現(xiàn)時,因為解決大問題的方法和解決小...
    程序員快速修煉閱讀 319評論 0 0
  • 昨晚,我跟老公嚷:這家務(wù)實在太煩人,怎么也做不完。 他答:是你把時間挪到了其它事情,所以才感覺事多。 ~~~(>_...
    麥田細語閱讀 283評論 3 0
  • 生活就是這樣充滿了戲劇性,充滿了自己不可預(yù)知的走向。很多時候根本沒有預(yù)料到的發(fā)展讓你的情緒處于冰火兩重天。或者說現(xiàn)...
    雀島札記閱讀 138評論 0 0
  • 作者 文森特.魯吉羅是美國紐約州立大學(xué)榮譽退休教授,是國際公認的強調(diào)思維教學(xué)在教育中核心地位的運動先驅(qū)。代表作品是...
    淇淇在太空閱讀 730評論 0 0

友情鏈接更多精彩內(nèi)容