0

我对单声道上的 F# 有疑问。我在我的大学做这门函数式编程课程。在课程中我们使用 F#,我使用 Xamarin 作为我的编辑器。

问题是我们上了一堂关于尾递归的课,作为提高效率的工具。但是当你不能写你的函数尾递归时,我们不得不使用连续的,这样我们使用堆而不是堆栈。

这似乎不适用于带有 F# 3.1 的单声道 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 回答