你得到一个例外,因为 30,000 个堆栈帧是一个相当大的数字:-)
您可以通过更谨慎的方式使用递归来解决它。要递归解决的理想问题是那些快速减少“搜索空间”的问题(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)
(a)搜索空间可以定义为您的整个可能答案集。你想尽快减少它。
而且,顺便说一句,递归的理想问题与理论/数学意义上的堆栈空间无关,它们只是可以表示为的任何问题:
- “更简单”的论点存在相同或相似的问题。
- 带有“最简单”参数的终止条件。
(“简单”,在这个意义上,意味着接近终止条件)。
理论/数学方法不需要考虑堆栈空间,但作为计算机科学家,我们必须。现实设定了限制:-)
另请参阅何时不使用递归?以及将递归转换为迭代的情况。