F# Mono上的F尾调用优化问题
我有一个关于单声道F的问题。我在大学里修函数式编程这门课。在本课程中,我们使用F,我使用Xamarin作为我的编辑器 问题是,我们上了一堂关于尾部递归的课,这是一种提高效率的工具。但是当您无法编写函数尾部递归时,我们必须使用continuous,这样我们使用的是堆而不是堆栈 这在Mono3.10.0和F3.1上似乎不起作用,我得到一个System.StackOverflowException。这应该是不可能得到的,因为continuous应该使用堆F# Mono上的F尾调用优化问题,f#,mono,xamarin,stack-overflow,continuation,F#,Mono,Xamarin,Stack Overflow,Continuation,我有一个关于单声道F的问题。我在大学里修函数式编程这门课。在本课程中,我们使用F,我使用Xamarin作为我的编辑器 问题是,我们上了一堂关于尾部递归的课,这是一种提高效率的工具。但是当您无法编写函数尾部递归时,我们必须使用continuous,这样我们使用的是堆而不是堆栈 这在Mono3.10.0和F3.1上似乎不起作用,我得到一个System.StackOverflowException。这应该是不可能得到的,因为continuous应该使用堆 let rec fibC n c = mat
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)))
我测试了一个斐波那契(Fibonacci)实现,它传递了累加器,而不是函数延续,如下所示:
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上运行良好,即没有堆栈溢出。
所以我想这只是使用continuations时TCO的一个问题。2013年6月的Xamarin解决了这个问题。有迹象表明Mono不支持尾部呼叫消除,请看,我想你在标题中是指mono上的延续问题,但我不能确定,所以我不会更改标题。@OnorioCatenacci我想应该是类似mono上的F尾部调用优化问题的标题。据我所知,上面的代码是为了使用一个延续作为一种手段来获取尾部位置的递归调用,从而利用TCO而编写的。这段代码是一个解决无尾递归和参数累加的例子。因此,这段代码将在windows.net机器上毫无问题地求解斐波那契40。