16得票3回答
如何判断在F#中一个函数是否是尾递归的

我写了下面这个函数:let str2lst str = let rec f s acc = match s with | "" -> acc | _ -> f (s.Substring 1) (s.[0]::acc) f...

14得票1回答
Lua中的尾调用优化

Lua声称它正确地实现了尾调用,因此无需为每个调用维护堆栈,从而允许无限递归。我试图编写一个求和函数,其中一个不是尾调用,而另一个是尾调用: 非尾调用版本function sum(n) if n > 0 then return n + sum(n-1) ...

21得票3回答
一些实现尾调用优化的好方法是什么?

我用 C/C++ 的混合方式编写了一个小的 Scheme 解释器,但是我还没有实现 proper tail calls 。 我知道经典的 Cheney on the MTA algorithm ,但是是否有其他好的方法来实现这个呢?我知道我可以将 Scheme 堆栈放在堆上,但仍然不是 p...

46得票5回答
为什么Scala编译器只有在方法被标记为final时才应用尾调用优化?

为什么Scala编译器只有在方法被声明为final时才会应用尾递归优化? 例如,下面的代码: class C { @tailrec def fact(n: Int, result: Int): Int = if(n == 0) result ...

9得票2回答
为什么这个 F# 序列函数不是尾递归的?

声明:这是我维护的F#随机测试框架FsCheck中出现的问题。我有一个解决方案,但我不喜欢它。此外,我也不理解这个问题——那只是被规避了。 (如果我们要使用专业术语)序列的一个相当标准的实现是: let sequence l = let k m m' = gen { let! x...

18得票1回答
Java是否支持尾递归?

可能是重复的问题: 为什么JVM仍然不支持尾递归优化? 我在网上看到了很多不同的答案,所以我想请教专家们。

17得票1回答
(正向)管道操作符是否会防止尾调用优化?

对于我在工作中遇到的参数优化问题,我编写了一个遗传算法来寻找一些好的设置,因为暴力解决方案是不可行的。不幸的是,当我第二天早上回来时,大多数时间都会出现一个StackOverflowException异常。 我已经使用F#相当长的时间了,所以我知道TCO和需要带有累加器参数的函数以及通常使用...

8得票2回答
为什么F#编译器不会为该函数创建尾递归调用?

我在F#中使用固定点组合器遇到了问题: let rec fix f a = f (fix f) a fix (fun body num -> if num = 1000000 then System.Console.WriteLine "Done!" e...

12得票1回答
为什么这里没有发生尾调用优化?

我们正在使用递归查找因数,但是遇到了堆栈溢出异常。我们已经阅读到在x64计算机上的C#编译器执行尾调用优化: JIT在运行优化代码而非调试时确实会进行尾调用。 在我们的程序中运行dotnet --configuration release执行到这一步:... ...

10得票2回答
使用Trampolines在Scala中对无限结构进行FoldRight

我们先来简单地定义一下foldRight: def foldRight[T, U](base: U)(f: (T, => U) => U)(as: Seq[T]): U = { as match { case Nil => base case head ...