问题标签 [trampolines]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - JS将递归函数转换为蹦床
我正在努力将下面的 JS 递归函数转换为一个蹦床函数,以避免使用深节点最大化调用堆栈。
它从传入的初始根节点返回一个包含所有子节点的数组。注意,list 是一个 Map,用于查找当前节点的子节点以进行下一次递归迭代。
如何设置蹦床结构以构建节点数组以在最后返回?
scala - 为什么 Haskell 不需要蹦床?
作为 Scala 开发人员学习 IO Monad,因此一般来说 Trampolining 的技术对于无法进行尾调用优化的递归来说是必需的,我想知道 Haskell 似乎是如何自然地避免它的。
我知道 Haskell 是一种懒惰的语言,但是我想知道是否有人可以进一步详细说明。
例如,为什么 ForeverM stackoverflow 不在 Scala 中?好吧,我可以回答蹦床,我可以在库和博客中找到执行此操作的实际代码。我实际上自己实现了一个基本的蹦床来学习。
它在 Haskell 中是如何发生的?有没有办法稍微解开懒惰,提供一些指示,也许还有有助于更好地理解它的文档?
graalvm - 使用 truffle graalvm 时完整的 CPS 转换可行性?
我正在开发一个解释器,最近才发现 graal truffle,如果我用它来实现解释器,它可以保证快速的性能。但是,据我所知,解释器的代码以及编译器优化它的难易程度会有所不同。我正在开发的解释器具有完全延续的功能,我使用 CPS 转换和蹦床来实现 TCO。如果我将它移植到松露,我是否希望获得体面的性能,或者由于代码的体系结构,它从根本上不会比用 java 编写的常规解释器更好地工作?
android - 在没有蹦床的情况下跟踪通知点击(在 Android 12 中被禁止)
Android 12 已禁止所谓的通知蹦床: https ://developer.android.com/about/versions/12/behavior-changes-12#notification-trampolines
目前,我正在通过分析工具跟踪通知点击事件,但使用“蹦床”,这是一种广播接收器,它在实际通知 Intent 之前发送事件以打开特定的 Activity。
在这里和那里阅读,我发现该方法的替代方案也可以避免蹦床,包括使用发送分析事件所需的信息填充 Intent extras。但在这里我看到了两个问题:
- 此逻辑应在所有涉及的活动上复制,因此很难使其可靠以避免错误/错误
- AFAIK,不可能在重新创建 Activity 时清理 Intent extras,这意味着,即使您删除了发送事件所需的 Intent Extras,如果重新创建相同的活动(即使用“不要保留活动”开发选项),使用原始的 Intent 附加功能,从而为单个真正的通知单击产生多个事件。
这是我用来额外消耗意图的函数:
您是否遇到过相同或类似的问题?你是怎么解决的?任何帮助将不胜感激。谢谢!
python - python中如何加速蹦床cps版fib函数并支持相互递归?
我尝试为 cps 版本的斐波那契函数实现蹦床。但我不能让它快速(添加缓存)并支持mutual_recursion。
实现代码:
这是可运行的示例。
跑号太慢了40
。当更大时,超过fib
了得到的最大递归深度。n
但是添加后lru_cache
会很快。iter trampolined 版本可以用于递归深度并且运行速度非常快。
这是其他一些人的工作:
- 支持cps版本缓存: https ://davywybiral.blogspot.com/2008/11/trampolining-for-recursion.html
- 支持mutual_recursion:https ://github.com/0x65/trampoline但它太难理解了。