【发布时间】:2015-05-31 01:44:21
【问题描述】:
public static String rec1 (String s) {
int n = s.length()/2;
return n==0 ? s : rec1(s.substring(n)) + rec1(s.substring(0,n));
}
public static String rec2 (String s) {
return s.length()<=1 ? s : rec2(s.substring(1)) + s.charAt(0);
}
为什么rec2 的复杂度大于rec1?
我对每个都进行了 10.000 次迭代,并使用 System.nanoTime() 测量了执行时间,结果如下:
rec1:字符串长度:200 平均时间:19912ns 递归调用:399 rec1:字符串长度:400 平均时间:42294 ns 递归调用:799 rec1:字符串长度:800 平均时间:77674 ns 递归调用:1599 rec1:字符串长度:1600 平均时间:146305 ns 递归调用:3199 rec2:字符串长度:200 平均时间:26386 ns 递归调用:200 rec2:字符串长度:400 平均时间:100677 ns 递归调用:400 rec2:字符串长度:800 平均时间:394448 ns 递归调用:800 rec2:字符串长度:1600 平均时间:1505853 ns 递归调用:1600所以在字符串长度为 1600 时,rec1 比 rec2 快 10 倍。我正在寻找一个简短的解释。
【问题讨论】:
-
是什么让你觉得rec2的复杂度>rec1?在每个方法中放置一个打印语句并尝试运行它们。例如,
rec1("1234")拨打 7 次电话,而rec2("1234")拨打 4 次。 -
检查我上面的编辑,我使用 System.nanoTime 测量了时间,并试图找出 rec2 比 rec1 快的原因。 (甚至禁用了speedstep)
-
我原来的答案是错误的。我现在已经更新了。
标签: java recursion methods complexity-theory