[英]converting a simple recursive haskell function to be tail recursive
2 周新 haskell 和函數式編程。 在 class 中覆蓋 foldl 和 foldr 的過程中,我發現我對尾遞歸很陌生,並且從未真正嘗試過編寫尾遞歸 function beofre(對於 foldl 如何遍歷它出現的列表也是新的)。 為了練習,我嘗試將以下內容重寫為尾遞歸: ...但是 ...
[英]converting a simple recursive haskell function to be tail recursive
2 周新 haskell 和函數式編程。 在 class 中覆蓋 foldl 和 foldr 的過程中,我發現我對尾遞歸很陌生,並且從未真正嘗試過編寫尾遞歸 function beofre(對於 foldl 如何遍歷它出現的列表也是新的)。 為了練習,我嘗試將以下內容重寫為尾遞歸: ...但是 ...
[英]Why does clang have trouble with optimizing tail calls in destructors?
這是一個簡化的單鏈表,其中每個節點擁有下一個節點,以及用於銷毀列表的 function:struct Node { Node* next = nullptr; ~Node() { delete next; } }; void Destroy(Node* head) { ...
[英]FoldRight over Infinite Structures in Scala using Trampolines
讓我們從foldRight的簡單定義開始:def foldRight[T, U](base: U)(f: (T, => U) => U)(as: Seq[T]): U = { as match { case Nil => base case head +: ne ...
[英]Tail call stack
我無法理解以匯編語言實現 Tail 調用所需的堆棧操作。 當我們對 function 進行 Tail 調用時,我們基本上想用被調用的 function 的激活幀覆蓋當前的激活幀。 我無法理解完成激活幀切換所需的過程。 RSP 如何更改以便位於正確的地址以及如何保持原始調用 function 的 R ...
[英]Question regarding tail call optimization
據我所知,進行尾調用優化的前提是遞歸點應該是function中的最后一句,並且應該立即返回遞歸調用的結果。 但為什么? 以下是 TCO 的有效示例: 那么,按照規則,下面的代碼也可以優化嗎? 為什么不? 我想知道我應該如何向其他人解釋為什么上述規則對於擁有 TCO 是必要的。 但不只是簡單地跟隨。 ...
[英]Tail call optimization with eigen
我試圖讓編譯器尾調用優化遞歸傳遞的特征表達式。 以下將使用 GCC -O2 進行優化: 以下不會: 即使我將計算傳遞為 sol = A.ldlt().solve(b).Eval(); 它無法執行優化。 為什么? ...
[英]Why is this tail-call optimized method not recognized as such by the Scala compiler?
這個簡單的正則表達式實現(此處為 scastie )無法編譯,我期望它編譯。 錯誤在第 14 行,其中一個中間遞歸調用被解釋為違反@tailrec要求。 雖然這個中間遞歸調用確實不在尾調用 position 中,但表達式的實際最后一次調用是,使得完整的表達式尾調用得到優化。 這條推理線可以通過對中 ...
[英]print a newline using tail call optimization
Igor Zhirkov 的《低級編程》一書中有一個未回答的問題: “嘗試在不調用 print_char 或復制其代碼的情況下重寫 print_newline。提示:閱讀有關尾調用優化的信息。”。 我花了一些時間閱讀關於尾調用優化的文章,但我不知道什么是正確的做法。 原始代碼(無尾調用): pr ...
[英]Why does non-trivial destructor of return type prevent tail-call optimization?
目前,在 C++ 編譯器中,尾調用優化的規則之一是返回類型必須是可簡單破壞的。 (基於分析 GCC、Clang 主干行為。MSVC 對任何非平凡類型都有問題)。 這個要求還有必要嗎? 由於 C++17 返回值優化是強制性的,function 似乎仍然可以使用跟蹤調用優化,即使返回類型不平凡。 這 ...
[英]How I could use tail call optimisation on this combination function?
我的練習,你可以在這里看到,說我需要實現 C(n, k) 的遞歸版本。 這就是我的解決方案:module LE1.Recursao.Combinacao where combina :: Integral a => a -> a -> a combina n k | k == ...
[英]Is there a way to optimize tail calls in Scala?
我知道 Scala 對尾遞歸函數(即遞歸調用是函數執行的最后一件事的函數)進行了優化。 我在這里要問的是是否有辦法優化對不同函數的尾調用。 考慮以下Scala代碼: 如果我們讓它執行足夠長的時間,它會產生一個堆棧溢出錯誤,可以通過分配更多的堆棧空間來緩解這個錯誤。 盡管如此,它最終會超出分配的空間 ...
[英]Can JavaScript function call subexpressions be tail calls?
考慮以下返回語句:return f() || g(); 調用f()顯然不是尾調用,因為如果f()是虛假的,則 function 實際上不會返回。 但是g()部分呢,那是尾調用嗎? 還是我必須像這樣重寫它:const temp = f(); if (temp) return temp; else ...
[英]Will this be tail call optimized in SWI-Prolog
phase_step是一個轉換數據的函數。 這個step_n會在與phase_step幾乎相同的內存中phase_step嗎? 如果沒有,我應該如何重寫它來做到這一點? 這將取決於具有單一解決方案的 phase_step 嗎? 編輯:在使用prolog_current_frame進行一些調 ...
[英]How to convert a variation of ackermann function to support tail call?
我目前正在解決一個問題,即在 scala 中實現 ackermann function 的變體,並支持尾調用優化,以便堆棧不會溢出。 問題是,我找不到尾調用優化它的方法。 有人告訴我 continuation-pass-style(CPS) 會有幫助,但即使我成功地用 CPS 風格重新實現了它,我 ...
[英]Scheme: Iterative process to reconstruct a list in original order?
我的問題是:如何編寫一個使用尾調用的過程,並以不相反的順序構造一個列表。 為了說明我的意思,這里是一個非常簡單的迭代過程示例,它創建了一個列表的副本: (define (copy-list ls) (define (iter cp-ls rest-ls) (if (null? r ...
[英]Why does this kind of tail call of fibonacci run faster than pure tree recursion in Haskell?
我正在嘗試理解尾調用遞歸。 我轉換純樹遞歸斐波那契函數: 到尾調用版本: 當我嘗試這兩個版本時,盡管我嘗試在第二個版本中使用seq強制嚴格評估,但似乎第二個版本比第一個 tree-recusion 更快! Haskell 如何處理 GHC 中的此類尾調用? 謝謝! ...
[英]Get results for sub problems using tail call recursion in Scala
我正在嘗試使用@tailrec計算每個子問題的結果,類似於普通遞歸解決方案如何為每個子問題生成解決方案。 以下是我處理的示例。 在這里,我使用Collatz Conjecture計算一個數字達到1時的計數。 舉個例子,讓我們假設它是32號 我得到以下 output。 正常遞歸解決方案將返回每個數字的 ...
[英]Telling GCC to tail-call a function
假設我有一個C函數: 有沒有辦法告訴GCC尾調用遞歸函數,就像 我可以通過將-O2標志傳遞給編譯器來實現這一點,但是我希望在較低的優化級別上執行尾調用行為,以便可以更快地進行編譯。 實際功能要復雜得多,我想使用TCO,因為這可以使迭代中的哪個狀態可以影響將來的迭代,以及每個 ...
[英]Erlang, Last Call Optimization, lambda functions, and how to prevent growing a stack
我正在編寫一些Erlang代碼,但遇到一種我不理解的怪異情況。 編碼: 輸出: 從我的理解這篇文章 ,二郎使用最后調用優化的地方,如果過去的事情的功能確實是調用另一個函數,該BeamVM反而會跳程序計數器的新功能的開始,而不是推一個新堆的幀。 這是否意味着在上述模式中,我 ...
[英]Do bound functions support proper tail calls in ES6?
在ECMAScript 2015語言規范中, Function.prototype.apply和Function.prototype.call的定義都包含“Perform PrepareForTailCall()”作為其中一個步驟,因此我們知道這些函數支持正確的尾調用(即尾調用)優化)。 ...