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

すべてのスタックをほとんど使い切ってしまった場合System.Runtime.CompilerServices.RuntimeHelpers.EnsureSufficientExecutionStackは、catchable をスローするを使用してみてください。InsufficientExecutionStackException

于 2013-04-22T15:58:44.870 に答える
0

をキャッチする代わりに、現在のスタック フレーム数を測定する whichStackOverflowExceptionを返すこともできます。(new StackTrace()).FrameCount

メソッドを比較するときは、同じ数のオーバーヘッド フレームが存在するように注意する必要があります。特に、ラムダ式fun ...はそれぞれスタック フレームを追加します。

于 2013-04-21T11:39:19.170 に答える