你得到一個例外,因爲30000個堆棧幀是一個相當大的數量:-)
您通過以更謹慎的方式使用遞歸解決它。遞歸地解決的理想問題是那些可以快速減少「搜索空間」的問題(a)。
例如,二叉樹的遍歷您的搜索空間每次減半你復發:
def find (searchkey, node):
if node = NULL:
return NULL
if searchkey = node.key:
return node
if searchkey < node.key:
return find (searchkey, node.left)
return find (searchkey, node.right)
增加兩個無符號整數(及以上自己的算法)是不很適合遞歸,因爲你「會吹出來的計算結果沒過多久,您的堆棧分配:
def add (a, b):
if a = 0:
return b
return add (a-1, b+1)
(一)搜索空間可定義爲您的整套可能的答案。你想盡可能快地減少它。
而且,順便說一句,遞歸理想的問題無關,在理論上/數學意義上的堆棧空間,他們只是可以表示任何問題:
- 相同或與「更簡單」的論點類似的問題。
- 「最簡單」參數的終止條件。
(「簡單」,在這個意義上,意味着接近終止條件)。
理論/數學方法不需要考慮堆棧空間,但我們必須像計算機科學家一樣。現實限制:-)
另請參閱When would I not use recursion?和Situations where you would convert recursion to iteration。
[C#遞歸深度 - 你有多深可以去]的可能重複(http://stackoverflow.com/questions/4513438/c-recursion-depth-how-deep-can-you-go)或[在C#堆棧容量](http://stackoverflow.com/questions/823724/stack-capacity-in-c) –
它運行良好! http://ideone.com/pGZki –