0

モノの F# に関する問題があります。私は大学で関数型プログラミングのこのコースを行っています。このコースでは F# を使用しており、エディターとして Xamarin を使用しています。

問題は、効率を得るためのツールとして末尾再帰のレッスンを行ったことです。しかし、関数の末尾再帰を記述できない場合は、スタックではなくヒープを使用するように、継続的に使用する必要がありました。

これは、F# 3.1 を使用する mono 3.10.0 では機能しないようです。System.StackOverflowException が発生します。継続的にヒープを使用する必要があるため、これを取得することは不可能です。

let rec fibC n c = 
match n with 
|0 -> c 0 
|1 -> c 1 
|n -> fibC (n-1) (fun v1 -> fibC (n-2) (fun v2 -> c(v1+v2)))
4

1 に答える 1

0

次のような関数 (継続) の代わりにアキュムレータを渡すフィボナッチ実装をテストしました。

let fib n = 
   let rec _fib i (a,b) =
      match i with 
      | 0 -> a
      | _ -> _fib (i-1) (b, a+b)
   _fib n (0,1)

Mono で問題なく動作しました。つまり、スタック オーバーフローはありませんでした。したがって、継続を使用する場合の TCO の問題だけだと思います。これに対処する 2013 年 6 月の Xamarinチケットがあります。

于 2014-11-10T22:54:49.487 に答える