亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

為什么遞歸函數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貢獻165條經驗 獲得超90個贊

首先貼出報錯信息:

RecursionError: maximum recursion depth exceeded

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


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

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

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

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函數判斷出參數為1?直接return?1?并且退出了函數,也就是打斷了遞歸。

##?去掉?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)?#這里是關鍵,去掉了return,致使參數無限的遞減下去而不終結
fact(5)?=?5?*?4?*?3?*?2?*?1?*?-1?*?fact(-2)
.
.
.
fact(5)?=?5?*?4?*?3?*?2?*?1?*?-1?*?...?*?-n?*?fact(-n-1)
.
.
.

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



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

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

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

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

import?sys

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

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

查看完整回答
1 反對 回復 2016-06-10
  • else_if
    else_if
    這個函數為什么不會無限遞歸下去? 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 之后的 程序還有別的出口, 如果仁兄確實 驗證過,請給出代碼。
點擊展開后面3
?
weibo_曦禪_03461137

TA貢獻3條經驗 獲得超1個贊



575af5a100016b8005000299.jpg

575af5a200018dcd05000042.jpg

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

查看完整回答
反對 回復 2016-06-11
?
else_if

TA貢獻2條經驗 獲得超0個贊

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

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

? ? if n==1:

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

? ? ? ? return?

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


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

TA貢獻3條經驗 獲得超1個贊

也不一定會報錯,我調試了,如果沒有return,就沒有返回值,函數運行的結果就是空值。


查看完整回答
反對 回復 2016-06-09
  • 4 回答
  • 0 關注
  • 2076 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號