|
|
1
56
考虑以下与RePL的相互作用。首先,我们用阶乘方法定义一个类:
现在,让我们在子类中重写它,使超类的答案加倍:
最后一次通话的结果是什么?你可能期望240。但没有:
这是因为当超类的方法进行递归调用时,递归调用通过子类。 如果覆盖的工作方式是240是正确的答案,那么在这里的超类中执行尾部调用优化是安全的。但Scala(或Java)不是这样工作的。 除非方法被标记为最终, 它可能不是在呼唤自己 当它进行递归调用时。 这就是为什么@tailrec不起作用,除非方法是final(或private)。 更新:我建议阅读另外两个答案(约翰和雷克斯的)。 |
|
|
2
23
递归调用可能是子类而不是超类;
如果这个漂亮的电话是尾部递归的,我们会打印出来
由于这种递归似乎很有用,并且如果允许对非final方法进行尾部调用,就会被破坏,因此编译器会插入一个真正的调用。 |
|
|
3
7
允许
编译器告诉你语义允许
|
|
|
4
1
不会出什么问题的。任何具有适当尾部调用消除的语言(SML、OCaml、F#、Haskell等)都可以做到这一点。Scala不支持的唯一原因是JVM不支持尾部递归,以及Scala通常使用的将尾部位置的自递归调用替换为
|
|
5
0
对于这个问题,人们普遍接受的答案实际上是误导性的,因为这个问题本身令人困惑。OP没有区分
关键是
对
这个
编译器可以使用
因此,公认的答案正确地解释了为什么非终结函数不能
[请注意,正如Jon Harrop所解释的,您无法实现
作为参考,这里是如何避免问题,而不必制定方法
这是因为
这是我用于所有递归算法的模式。 |
|
|
MMedina · 将powershell应用于子文件夹 1 年前 |
|
|
YorSubs · Linux中遍历目录的时间不同方法[关闭] 1 年前 |
|
Romn · 在递归函数中键入元组或元组列表 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
Ack · 尝试迭代JSON数据以匹配用户输入 1 年前 |