cost 129 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 是必要的。 但不只是简单地跟随。 ...

为什么 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代码: 如果我们让它执行足够长的时间,它会产生一个堆栈溢出错误,可以通过分配更多的堆栈空间来缓解这个错误。 尽管如此,它最终会超出分配的空间 ...

如何转换 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