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