cost 206 ms
將簡單遞歸 haskell function 轉換為尾遞歸

[英]converting a simple recursive haskell function to be tail recursive

2 周新 haskell 和函數式編程。 在 class 中覆蓋 foldl 和 foldr 的過程中,我發現我對尾遞歸很陌生,並且從未真正嘗試過編寫尾遞歸 function beofre(對於 foldl 如何遍歷它出現的列表也是新的)。 為了練習,我嘗試將以下內容重寫為尾遞歸: ...但是 ...

尾調用棧

[英]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(); 它無法執行優化。 為什么? ...

為什么 Scala 編譯器無法識別這種尾調用優化方法?

[英]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 似乎仍然可以使用跟蹤調用優化,即使返回類型不平凡。 這 ...

有沒有辦法優化 Scala 中的尾調用?

[英]Is there a way to optimize tail calls in Scala?

我知道 Scala 對尾遞歸函數(即遞歸調用是函數執行的最后一件事的函數)進行了優化。 我在這里要問的是是否有辦法優化對不同函數的尾調用。 考慮以下Scala代碼: 如果我們讓它執行足夠長的時間,它會產生一個堆棧溢出錯誤,可以通過分配更多的堆棧空間來緩解這個錯誤。 盡管如此,它最終會超出分配的空間 ...

這會是 SWI-Prolog 中優化的尾調用嗎

[英]Will this be tail call optimized in SWI-Prolog

phase_step是一個轉換數據的函數。 這個step_n會在與phase_step幾乎相同的內存中phase_step嗎? 如果沒有,我應該如何重寫它來做到這一點? 這將取決於具有單一解決方案的 phase_step 嗎? 編輯:在使用prolog_current_frame進行一些調 ...

如何轉換 ackermann function 的變體以支持尾調用?

[英]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 ...

為什么這種斐波那契的尾調用比 Haskell 中的純樹遞歸運行得更快?

[英]Why does this kind of tail call of fibonacci run faster than pure tree recursion in Haskell?

我正在嘗試理解尾調用遞歸。 我轉換純樹遞歸斐波那契函數: 到尾調用版本: 當我嘗試這兩個版本時,盡管我嘗試在第二個版本中使用seq強制嚴格評估,但似乎第二個版本比第一個 tree-recusion 更快! Haskell 如何處理 GHC 中的此類尾調用? 謝謝! ...

在 Scala 中使用尾調用遞歸獲取子問題的結果

[英]Get results for sub problems using tail call recursion in Scala

我正在嘗試使用@tailrec計算每個子問題的結果,類似於普通遞歸解決方案如何為每個子問題生成解決方案。 以下是我處理的示例。 在這里,我使用Collatz Conjecture計算一個數字達到1時的計數。 舉個例子,讓我們假設它是32號 我得到以下 output。 正常遞歸解決方案將返回每個數字的 ...

告訴GCC尾調用一個函數

[英]Telling GCC to tail-call a function

假設我有一個C函數: 有沒有辦法告訴GCC尾調用遞歸函數,就像 我可以通過將-O2標志傳遞給編譯器來實現這一點,但是我希望在較低的優化級別上執行尾調用行為,以便可以更快地進行編譯。 實際功能要復雜得多,我想使用TCO,因為這可以使迭代中的哪個狀態可以影響將來的迭代,以及每個 ...

Erlang,Last Call Optimization,lambda函數以及如何防止堆棧增加

[英]Erlang, Last Call Optimization, lambda functions, and how to prevent growing a stack

我正在編寫一些Erlang代碼,但遇到一種我不理解的怪異情況。 編碼: 輸出: 從我的理解這篇文章 ,二郎使用最后調用優化的地方,如果過去的事情的功能確實是調用另一個函數,該BeamVM反而會跳程序計數器的新功能的開始,而不是推一個新堆的幀。 這是否意味着在上述模式中,我 ...


 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM