Mono上的F#尾部调用优化问题

时间:2014-11-10 20:16:17

标签: f# mono xamarin stack-overflow continuation

我有关于单声道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)))

1 个答案:

答案 0 :(得分:0)

我测试了一个Fibonacci实现传递累加器而不是函数(continuation),如下所示:

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 ticket解决了这个问题。

相关问题