繁体   English   中英

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

[英]F# tail call optimization issues on Mono

我在单声道上遇到有关F#的问题。 我在我的大学中的函数式编程课程中学习。 在课程中,我们使用的是F#,我使用Xamarin作为编辑器。

问题是,我们有一个关于尾递归的课程,作为提高效率的工具。 但是,当您无法编写尾部递归函数时,我们必须使用continuous,这样我们将使用堆而不是堆栈。

这似乎不适用于带有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)))

我测试了通过累加器而不是像这样的函数(延续)的斐波那契实现:

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 门票解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM