0

假设我有一个 int -> int 类型的递归函数 f(x)。预计 x 越大,f(x) 将执行的递归调用越多。

给定一个递增顺序的无限整数序列,我对序列中的第一个整数感兴趣,当在其上使用 f 时会导致 StackOverflowException 。

我怎样才能做到这一点?

到目前为止,我已经尝试制作一个简单的函数来测试在给定整数上使用给定函数时是否抛出了 StackOverflowException。它看起来像这样:

let overflows f x = 
    try 
        ignore (f x) in false
    with
        | :? System.StackOverflowException -> true

但是,它似乎在抛出 StackOverflowException 时无法捕获它,即使这是本意。

有什么建议么?

4

3 回答 3

1

您可以尝试 using ,如果您几乎用完所有堆栈System.Runtime.CompilerServices.RuntimeHelpers.EnsureSufficientExecutionStack,它会抛出一个可捕获的。InsufficientExecutionStackException

于 2013-04-22T15:58:44.870 回答
1

在 .NET 2.0 及更高版本中,无法捕获StackOverflowException- 进程将被终止:

http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx

如果您只是为了测试函数而这样做,则有一种更简单的方法来获取您想要的信息:编写一些代码,将计数器(甚至只是换行符)写入文本文件,并在每次迭代时调用它. 确保每次写入文件时都调用.Flush()TextWriter(或其他),以便实际写入数据而不仅仅是缓冲。当您运行程序时,它会崩溃(如预期的那样),但文件中的行数将与崩溃前函数执行的迭代次数相同。

于 2013-04-21T12:54:58.303 回答
0

捕获的替代方法StackOverflowException是返回(new StackTrace()).FrameCount测量当前堆栈帧数。

在比较方法时必须注意确保有相同数量的开销帧。特别是,lambda 表达式fun ...将分别添加一个堆栈帧。

于 2013-04-21T11:39:19.170 回答