第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么遞歸函數(shù)fact(n)少個return會報錯?

為什么遞歸函數(shù)fact(n)少個return會報錯?

else_if 2016-06-09 20:13:30
def?fact(n): ????if?n==1: ????????return?1 ????n*fact(n-1)
查看完整描述

4 回答

已采納
?
清波

TA貢獻(xiàn)165條經(jīng)驗 獲得超90個贊

首先貼出報錯信息:

RecursionError: maximum recursion depth exceeded

遞歸錯誤:超出最大遞歸深度


好,這說明兩個問題,其一 Python 對遞歸的深度有限制, 其二 這個函數(shù)超出了這個限度。

先說下后者吧,為什么去掉 return ?之后會 使這個函數(shù)超出了 Python 的最大遞歸深度呢, 這是因為 return 有兩個屬性:

1 返回值,2 結(jié)束函數(shù)執(zhí)行。 如果去掉了 return 這個遞歸函數(shù)就會無限遞歸下去,大致執(zhí)行效果如下:

fact(5)

##?沒有去掉?return?時:
fact(5)?=?5?*?fact(4)
fact(5)?=?5?*?4?*?fact(3)
fact(5)?=?5?*?4?*?3?*?fact(2)
fact(5)?=?5?*?4?*?3?*?2?*?fact(1)
fact(5)?=?5?*?4?*?3?*?2?*?1?##?此時fact函數(shù)判斷出參數(shù)為1?直接return?1?并且退出了函數(shù),也就是打斷了遞歸。

##?去掉?return?時:
fact(5)?=?5?*?fact(4)
fact(5)?=?5?*?4?*?fact(3)
fact(5)?=?5?*?4?*?3?*?fact(2)
fact(5)?=?5?*?4?*?3?*?2?*?fact(1)
fact(5)?=?5?*?4?*?3?*?2?*?1?*?fact(-1)?#這里是關(guān)鍵,去掉了return,致使參數(shù)無限的遞減下去而不終結(jié)
fact(5)?=?5?*?4?*?3?*?2?*?1?*?-1?*?fact(-2)
.
.
.
fact(5)?=?5?*?4?*?3?*?2?*?1?*?-1?*?...?*?-n?*?fact(-n-1)
.
.
.

##?所以最終就突破了?最大遞歸深度。



現(xiàn)在我們說下, Python 對遞歸深度的限制, 一般來說是 1000, 好像也有人說 是 997 什么的,大概就在這個范圍。

那么為什么Python 會對遞歸 這個 看起來特別強(qiáng)大的 解決問題的思想加以限制呢?

這就要說到, Python 中遞歸的原理了,簡單來說就是每一次遞歸都建立一個函數(shù),也就是說在內(nèi)存中 占用一塊地址,如果不加以限制的話, 就會導(dǎo)致 內(nèi)存溢出,這時候程序 就會報錯了, 所以Python 對遞歸的深度加以限制。

Python 也給出了 改變這個限制的方法:

import?sys

sys.setrecursionlimit(depth)?##?depth?為int?類型,?傳進(jìn)去就可以改變遞歸的最大深度了。

不建議這么做,如果一個問題需要突破遞歸深度才能解決,那么遞歸也許就不是這個問題的最優(yōu)解了, 建議用其他方式解決問題,而不是輕易改變遞歸深度。

查看完整回答
1 反對 回復(fù) 2016-06-10
  • else_if
    else_if
    這個函數(shù)為什么不會無限遞歸下去? def move(n, a, b, c): if n==1: print a,'-->',c return move(n-1,a,c,b)
  • 昨天無所謂3300770
    昨天無所謂3300770
    這程序就算n*fact(n-1)不return也不會無限遞歸下去好嗎,無限遞歸只是因為遞歸程序沒有出口,這程序有出口n=1
  • 清波
    清波
    額,這位仁兄這是在說哪個程序?我沒看出來 去掉 return 之后的 程序還有別的出口, 如果仁兄確實(shí) 驗證過,請給出代碼。
點(diǎn)擊展開后面3
?
weibo_曦禪_03461137

TA貢獻(xiàn)3條經(jīng)驗 獲得超1個贊



575af5a100016b8005000299.jpg

575af5a200018dcd05000042.jpg

這兩個的報錯是不一樣的,一個沒有返回值,一個是超出最大限制了。

查看完整回答
反對 回復(fù) 2016-06-11
?
else_if

TA貢獻(xiàn)2條經(jīng)驗 獲得超0個贊

這個函數(shù)為什么不會無限遞歸下去?

def move(n, a, b, c):

? ? if n==1:

? ? ? ? print a,'-->',c

? ? ? ? return?

? ? move(n-1,a,c,b)


查看完整回答
反對 回復(fù) 2016-06-10
?
weibo_曦禪_03461137

TA貢獻(xiàn)3條經(jīng)驗 獲得超1個贊

也不一定會報錯,我調(diào)試了,如果沒有return,就沒有返回值,函數(shù)運(yùn)行的結(jié)果就是空值。


查看完整回答
反對 回復(fù) 2016-06-09
  • 4 回答
  • 0 關(guān)注
  • 2070 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號