【发布时间】:2018-10-05 12:54:01
【问题描述】:
我不是在问我应该使用递归还是迭代,或者它们之间哪个更快。我试图了解迭代和递归所花费的时间,我想出了一个有趣的模式,即两者所花费的时间,即文件顶部的内容比另一个花费更多的时间。
例如:如果我在一开始就编写 for 循环,则它比递归花费更多时间,反之亦然。这两个过程所用时间之间的差异非常大,大约是 30 到 40 倍。
我的问题是:-
- 循环的顺序和递归是否重要?
- 有什么和印刷有关的吗?
- 这种行为的可能原因是什么?
以下是我在同一个文件中的代码,我使用的语言是 scala?
def count(x: Int): Unit = {
if (x <= 1000) {
print(s"$x ")
count(x + 1)
}
}
val t3 = System.currentTimeMillis()
count(1)
val t4 = System.currentTimeMillis()
println(s"\ntime taken by the recursion look = ${t4 - t3} mili second")
var c = 1
val t1 = System.currentTimeMillis()
while(c <= 1000)
{
print(s"$c ")
c+=1
}
val t2 = System.currentTimeMillis()
println(s"\ntime taken by the while loop = ${t2 - t1} mili second")
在这种情况下,递归和while循环花费的时间分别是986ms和20ms。
当我切换循环和递归的位置时,即先循环后递归,递归和 while 循环的时间分别为 1.69 秒和 28 毫秒。
编辑 1: 如果递归代码在顶部,我可以看到与 bufferWriter 相同的行为。但当递归低于循环时,情况并非如此。当递归低于循环时,它所花费的时间几乎相同,相差 2 到 3 毫秒。
【问题讨论】:
-
这个问题没有一般的答案,因为编译器也很神奇,有时递归函数会展开到循环中(参见尾递归)。
-
@AndreasNeumann 那么它取决于哪件事?你能告诉我吗?
-
使用BufferedWriter时也存在时间差异。因此,我们不能为此责怪 print 或 println。
标签: scala performance recursion tail-recursion