tail-recursion

    2热度

    3回答

    我一直在试图将我的一些代码转换为纯函数,以便学习如何以功能的方式使用Kotlin,通过这段简单的代码片段,我想不出任何方法使我的calculateFibonacci函数成为纯函数。 我知道一个潜在的递归解决方案,但是对于潜在的堆栈溢出,Kotlin是否实现了尾部呼叫优化? 例子: val fibonacciValues = hashMapOf<Int, BigInteger>(0 to BigI

    2热度

    2回答

    我有一些地图 (def m1 [{:a 1, :b 2, :c 0} {:a 1, :b 3, :c 0} {:a 1, :b 0, :c 2} {:a 1, :b 3, :c 1} {:a 1, :b 0, :c 3}]) ,我可以递归组与该功能 (defn group [ks coll] (if (empty? ks) coll

    1热度

    3回答

    假设有一些有用的转换函数,例如random_spelling_error,我们想申请n次。 我的临时解决方案是这样的: def reapply(n, fn, arg): for i in range(n): arg = fn(arg) return arg reapply(3, random_spelling_error, "This is not a tes

    3热度

    1回答

    我正在通过阅读RúnarBjarnason的Stackless Scala with Free Monad这篇文章来学习斯卡拉的蹦床技巧。但是我陷入了第4.3节“容易出错”。 有一件事让我很困惑,f(x)可以直接触发另一个内部呼叫给定FlatMap(x, f)。 resume已经是尾部递归,所以它必须发生在一个resume调用中。但是resume中的所有封装函数都应该导致一个蹦床实例。所以我找不到

    0热度

    1回答

    如何使尾部递归下的findNextAndTail? def uncons[A](s: Seq[A]): Option[(A, Seq[A])] = for (h <- s.headOption) yield (h, s.tail) // This works as-is. How can I make this function tail recursive? // @tai

    0热度

    1回答

    我想做一个BigInteger的阶乘(在Kotlin中)。 当我尝试做9000时,发生尾部递归,我得到了StackOverFlow错误!。 使用非递归函数我可以做到这一点...但我很好奇如何避免这种错误。 这里是我的代码: import java.math.BigInteger fun tail_recursion_factorial(n: BigInteger, factorialOfN:

    3热度

    1回答

    使用作家单子#尾递归 let inline bind ma fm = let (Writer (a, log1)) = ma let mb = fm a let (Writer (b, log2)) = mb let sum = (^w : (static member add : ^w * ^w -> ^w) (log1, log2)) Writ

    0热度

    1回答

    我有一个孩子的列表和父母的列表。我也有一个childeId-parentId的地图。父母可以有n个孩子,但孩子有一个直系父母。 我想从Java中的父级获取每个孩子的路径。我怎样才能递归呢? 我有基团为:根,ABC,ASD,XYZ,123,XYZ2] 父子图:{根= ABC,根系= ASD,根系= XYZ,根系= 123,XYZ = XYZ2} 我想每个孩子的路径为: {根/ ABC,根/ ASD,

    2热度

    1回答

    我有这样定义Expr的类的一堆: sealed trait BoolExpr sealed trait Value[T] { def get: T } final case class AndExpr(left: Expr, right: Expr) extends BoolExpr final case class EqualsExpr[T](value: Value[T],

    3热度

    1回答

    我知道还有其他方法可以避免使用累加器,并且内置的++会将一个列表附加到另一个列表。但是,如果我用累加器构建我自己的尾递归附加函数,有什么方法可以在下面的代码片段之一中使用lists:reverse()?谢谢 joinWithAccumulator2(X,Y) -> joinWithAccumulator2(lists:reverse(X), [], Y). joinWithAccum