【发布时间】:2013-02-18 21:04:13
【问题描述】:
尾递归更高效,因为它重用相同的堆栈帧而不是创建一个新的堆栈帧,但为什么方案中的所有内容都需要这样做?
【问题讨论】:
-
因为你刚才所说的。等待。 “Scheme 中的所有内容”都不是尾递归的;因为 TR 在 Scheme 中被广泛使用,所以 Scheme 要求正确实现尾递归。而且,因为
call/cc没有它是不可能的。 -
没有尾调用就不能调用/抄送?我不明白你为什么提出这个要求。
-
@JohnClements 我的意思是说“如果没有适当的 TR,就不可能使用它”。对
call/cc的调用应该回退调用堆栈;但如果没有 TR,对函数的调用会保留其调用堆栈。所以即使你允许它,也会有堆栈爆炸。这是我的想法。 -
@WillNess:哦...我认为您的意思是“对使用 call/cc 捕获的延续的调用应该倒回调用堆栈”...我同意,但是 tail-calling/tail-递归与此正交;您可以拥有一种非尾部调用语言,该语言仍然允许由使用延续引起的堆栈修改。事实上,Rhino 是一个开源的 JavaScript 实现,它是非尾调用的,但具有持续捕获和调用机制。
-
@JohnClements 很有趣,我不知道(是的,这 是 我的意思... :))所以在 Rhino 中对捕获的延续的调用是不同的然后是一个普通的电话,然后呢?我会再读一些关于这方面的内容,谢谢。 :)
标签: scheme tail-recursion