python 遞歸,return結(jié)果None

return的作用是將函數(shù)結(jié)果返回,即退出def函數(shù)模塊。大量的教材和網(wǎng)上教程都有說明函數(shù)執(zhí)行遇到return就會結(jié)束,返回一個值給調(diào)用函數(shù)處。常規(guī)用法確實(shí)是這樣,但在遞歸調(diào)用中卻存在一個坑,今天就遇到了,舉個例子:

一個簡單的不斷相加的遞歸小程序:

def add(sum,x,y):
    if sum<10:
        x +=2
        y +=2
        sum=x+y
        add(sum,x,y)
    else:
        sum=x+y
        return sum
print add(0,0,0)

運(yùn)行程序得到的結(jié)果為:

結(jié)果卻是None,讓人匪夷所思,更改一下,在return前打印出返回值:

經(jīng)過計算,結(jié)果確實(shí)應(yīng)該是12,明明已經(jīng)計算出了正確的值,為什么函數(shù)返回值是None呢。經(jīng)過多方查閱,發(fā)現(xiàn)自己踩坑里去了,慣性思維讓我認(rèn)為return必然會使得def函數(shù)模塊結(jié)束返回一個值,可實(shí)際上在遞歸中并不是,如果改變約束條件在return之后函數(shù)還會繼續(xù)遞歸計算。

真正的原因是此處的return僅僅是上一次遞歸調(diào)用函數(shù)本身時候的返回值,而def函數(shù)塊并沒有返回任何值。也就是說這個return僅屬于上一次遞歸調(diào)用,并不屬于def函數(shù)塊。也就是說整個def函數(shù)塊沒有return,也就沒有出口,自然不會有數(shù)據(jù)出去,所以得到None,將程序改變一下:

def add(sum,x,y):

    if sum<10:
        x +=2
        y +=2
        sum=x+y
        sum=add(sum,x,y)
        return sum
    else:
        sum=x+y
        print (sum) 
        return sum
print (add(0,0,0))

這次就正確了,程序多次遞歸后,運(yùn)行到else,此時返回一個值到達(dá)sum=add(sum,x,y)的sum,再return sum,此時為def函數(shù)塊的返回值。而之前程序運(yùn)行到sum=add(sum,x,y)時由于等號右邊的遞歸使得程序一直在計算,sum并未被賦值,進(jìn)而下面的

return sum并未執(zhí)行,所以只有一個返回值。

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

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

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,044評論 0 2
  • 一、快捷鍵 ctr+b 執(zhí)行ctr+/ 單行注釋ctr+c ...
    o_8319閱讀 6,032評論 2 16
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,051評論 0 7
  • 借來的觀點(diǎn)和思路,寫起來太難,感覺表達(dá)也沒有邏輯但還是得堅持。 逆代購-重拾國貨 相信代購已經(jīng)是大多數(shù)人聽說過的詞...
    30前立xoxo閱讀 319評論 0 0
  • 冷靜冷靜 不要胡言亂語 熱鬧的房間里 我一個人的孤寂 想出去走走 卻漫無目的 在這個快樂的節(jié)日里 我一個人的哭泣
    糖湯燙閱讀 247評論 0 1

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