gpt4 book ai didi

c# - 递归堆栈大小?

转载 作者:行者123 更新时间:2023-11-30 18:57:22 27 4
gpt4 key购买 nike

class Program  
{
static void Main(string[] args)
{
Test(0);
}

static void Test(int i)
{
if (i > 30000)
{
return;
}
Test(i + 1);
}
}

为什么在调用上述示例时获取递归函数并抛出 StackOverflowException。

(因为超过了默认的递归堆栈大小?)

但我想知道如何解决这个问题。

谢谢。

最佳答案

你得到一个异常,因为 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) 搜索空间可以定义为您的整组可能答案。您希望尽快减少它。

顺便说一句,递归的理想问题在理论/数学意义上与堆栈空间无关,它们只是可以表示为的任何问题:

  • 具有“更简单”论证的相同或相似问题。
  • 带有“最简单”参数的终止条件。

(“简单”,在这个意义上,意味着接近终止条件)。

理论/数学方法不需要考虑堆栈空间,但作为计算机科学家,我们必须考虑。现实设定了限制:-)

另见 When would I not use recursion?Situations where you would convert recursion to iteration .

关于c# - 递归堆栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7542570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com