tail-recursion

    6熱度

    2回答

    本書的第9章Expert F#3.0顯示瞭如何在遍歷二叉樹時避免堆棧溢出時使用continuation-passing樣式。我編寫了與本書代碼幾乎相同的樹遍歷代碼,但是我仍然遇到堆棧溢出問題。我的代碼如下: type 'a Tree = | Leaf of 'a | Branch of 'a Tree * 'a Tree let rec mkLeftLeaningTree

    3熱度

    1回答

    我是still試圖實現2-3根手指樹,我取得了很好的進展(repository)。在做一些基準測試時,我發現當樹很大時,我的基本toList結果爲StackOverflowException。起初,我看到一個簡單的修復,並使其成爲尾遞歸。 不幸的是,事實證明,toList是不是罪魁禍首,但viewr是: /// Return both the right-most element and the

    0熱度

    1回答

    如何將下面的ML代碼轉換爲尾遞歸函數?我盯着它,試圖弄清楚幾個小時,我看不出如何。 datatype Tree = NULL | NODE of Tree*Tree | VAL of int; fun dup(NULL) = NULL | dup(VAL(y)) = NODE(VAL(y),VAL(y)) | dup(NODE(y1,y2)) = NODE(dup(y1), dup(y2))

    -2熱度

    1回答

    我需要做一個函數來計算平均值,並且返回大於平均值的值的數目。例如,傳遞{4,5,12,17}的數組應該返回2(因爲12和17比平均值9.5大)。到目前爲止,我已經寫了函數來返回平均值,但是我怎樣才能讓它計數大於平均值的數字並保持它的尾遞歸? int TAvg(int* a, int size, int acc=0, int num=0){ //acc is the sum so far, num

    2熱度

    3回答

    我有這個遞歸函數來添加n個偶數的立方體,我不想把它變成尾遞歸。 int sum_even_cubes_rec(int n) { if (n < 2) return 0; if ((n % 2) == 0) { return (n*n*n + sum_even_cubes_rec(n - 1)); } else { return (0 + sum_even_cub

    1熱度

    1回答

    我有這樣的方法: private String computePerm(int iteration) { if (iteration < n + 1) { return Character.toString((char) (iteration + 48)); } else { if (iteration % n == 0) { r

    0熱度

    1回答

    我測試了在Scala中尾遞歸優化的性能。所以我在eclipse和sbt中測試它。但是,我只得到尾遞歸版本比正常情況更差的結果。我不知道它的原因。 這是我的代碼。 package MyList sealed trait List[+A] case object Nil extends List[Nothing] case class Cons[+A](head: A, tail: List[

    1熱度

    2回答

    我想在遞歸尾模式下計算Prolog中的斐波納契數列。 fibonacci(0,0). fibonacci(1,1). fibonacci(N,Result) :- fibonacci(N,1,0). fibonacci(N,Result,Count) :- Count < N, !, Count1 is Count + 1, Result1

    3熱度

    1回答

    我想了解如何在計算表達式中正確調用遞歸函數,並且不會出現堆棧溢出異常。據我瞭解這是相當知名的問題,但仍然無法把握這個概念。也許有人對此有簡單的解釋或例子。 這裏我的例子 我想跟蹤建設者具有類似於seq但不與序列工作的單子,而不是與其他一些之一,例如option行爲和遞歸循環僅返回最新的非無值。可能嗎 ? 這僅僅是例子,代碼將無限運行但不應該stackowerflow例外 據我瞭解,在結合的方法,代

    1熱度

    1回答

    我一次又一次地使用switch語句。每當我經常發現自己想在我的函數中使用return語句。我想知道用這種方式編寫的switch語句是否仍然是tail-call優化的。 function misc(x) { switch(true){ case x > 1: return misc(x-1); break; default: