用python寫遞迴方法解決八皇后問題時,出現了很多問題
遞迴中的return只會退出當前呼叫的函式f
tf_t
ft,如果僅在f
tf_t
ft中return了,那麼程式不會直接退出整個遞迴呼叫,而是返回到上乙個呼叫函式ft−
1f_
ft−1
,繼續執行ft−
1f_
ft−1
中沒有執行完的部分,所以在寫return的時候,一定要考慮清楚return 的值和return的情況,特別是if,else比較多的情況時,經常會有一些情況忘記新增return, 為自己的函式新增return 是個好的習慣,即使並不需要確切的返回值。
使用下面的命令可以獲取當前遞迴的最大深度限制:
import sys
sys.getrecursionlimit(
)
我的計算機預設最大的遞迴深度是1000。
我們可以通過手動設定深度值:
import sys
sys.setrecursionlimit(
2000000000
)
但是手動設定的這個值並不是實際可以呼叫的函式深度,看下面的**:
"""
i = 998 時,正常
i = 999 時,報錯:maximum recursion depth exceeded in comparison
由此可知python遞迴預設深度為 998
如果超過998,則最大遞迴深度至少+2
"""import sys
deffact
(n):
if n==1:
return
1return n + fact(n -1)
i =999
sys.setrecursionlimit(i+2)
#設定最大遞迴深度,如果注釋該行**則執行報錯
s = fact(i)
print
("\r\n1-%s的整數之和是:%s"
%(i,s)
)
在預設最大深度為1000的情況下,只可以呼叫998次函式,其實是因為,手動設定的這個數其實是棧的最大深度,在呼叫執行前,棧中已有其他的東西,呼叫inpect.stack()檢視棧中的東西:
stackoverflow:max recursion is not exactly what sys.getrecursionlimit() claims. how come?中有更詳細的解釋。
但是這個值依然是有限的,最大值為2147483647,否則會報overflowerror: python int too large to convert to c long,可以參考如下c long的取值範圍:
型別名稱
位元組數取值範圍
signed char
1-128~+127
short int
2-32768~+32767
int4
-2147483648~+2147483647
long int
4-2147483648~+2141483647
long long long int
8-9223372036854775808~+9223372036854775807
手動設定最大深度後,對於n=8的皇后問題,雖然能夠輸出部分解,且不報超過最大深度的錯誤,但是會報:process finished with exit code -1073741571 (0xc00000fd),程式依然沒能走完,仍然棧溢位,除了強制增加棧空間外,可以考慮回溯剪枝或者將回溯遞迴改寫成非遞迴的形式。
python3預設遞迴最大深度是998
記錄一次在遞迴中使用 yield 的踩坑
在一次遍歷檔案的時候,想起可以使用 yield 來減少記憶體占用,但很不幸在遞迴中遇到盲區了 function testrecursion int number else testrecursion 0 php test.php很驚訝,var dump 按道理會輸出 1 到 100,為嘛乙個都不輸出...
關於Python 函式遞迴中的 sin之舞
最近fj為他的奶牛們開設了數學分析課,fj知道若要學好這門課,必須有乙個好的三角函式基本功。所以他準備和奶牛們做乙個 sine之舞 的遊戲,寓教於樂,提高奶牛們的計算能力。不妨設 an sin 1 sin 2 sin 3 sin 4 sin n sn a1 n a2 n 1 a3 2 an 1 fj...
遞迴中關於遞迴語句後面內容的執行
遞迴函式中,位於遞迴呼叫語句後的語句的執行順序和各個被呼叫函式的順序相反 下面看乙個經典的例子 include void up and down int int main void void up and down int n 輸出結果 level 1 n location 0240ff48 lev...