小编gw1*_*1zz的帖子

在JVM中运行时在Scala中使用递归

通过搜索此站点和Web上的其他位置,JVM不支持尾调用优化.因此,这是否意味着如果要在JVM上运行,则不应写入可能在非常大的输入列表上运行的尾递归Scala代码(如下所示)?

// Get the nth element in a list    
def nth[T](n : Int, list : List[T]) : T = list match {
            case Nil => throw new IllegalArgumentException
            case _ if n == 0 => throw new IllegalArgumentException
            case _ :: tail if n == 1 => list.head
            case _ :: tail  => nth(n - 1, tail)
}
Run Code Online (Sandbox Code Playgroud)

Martin Odersky的Scala示例包含以下段落,似乎表明存在适合递归的情况或其他环境:

原则上,尾调用总是可以重用调用函数的堆栈帧.但是,某些运行时环境(例如Java VM)缺少基本条件,以使堆栈帧重用用于尾调用.因此,生产质量Scala实现只需要重新使用直接尾递归函数的堆栈帧,其最后一个操作是对自身的调用.其他尾调用也可以进行优化,但不应该在实现中依赖于此.

任何人都能解释一下这段中间两句话是什么意思吗?

谢谢!

optimization jvm scala tail-recursion jvm-languages

11
推荐指数
2
解决办法
1335
查看次数

列出当前目录中由Mercurial控制的文件

我有一些目录包含一些文件,这些文件是Hg存储库的一部分,而另一些则不是.如何列出当前目录中属于存储库的文件?

我知道

hg status | grep "\? Path/To/Dir/In/Repo"
Run Code Online (Sandbox Code Playgroud)

获取所有属于存储库的文件,这样我就可以反转正则表达式,但"hg status"在大型存储库上也需要很长时间,因此不需要的解决方案将是理想的.

此外,如果可能,解决方案不应该需要任何扩展.

mercurial

4
推荐指数
1
解决办法
808
查看次数