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
?Сложность Java двух рекурсивных методов
Я сделал 10.000 итераций на каждом и измеряли время выполнения с помощью System.nanoTime() со следующими результатами:
rec1: Stringlength: 200 Avgtime: 19912ns Recursive calls: 399 rec1: Stringlength: 400 Avgtime: 42294 ns Recursive calls: 799 rec1: Stringlength: 800 Avgtime: 77674 ns Recursive calls: 1599 rec1: Stringlength: 1600 Avgtime: 146305 ns Recursive calls: 3199 rec2: Stringlength: 200 Avgtime: 26386 ns Recursive calls: 200 rec2: Stringlength: 400 Avgtime: 100677 ns Recursive calls: 400 rec2: Stringlength: 800 Avgtime: 394448 ns Recursive calls: 800 rec2: Stringlength: 1600 Avgtime: 1505853 ns Recursive calls: 1600
Так на StringLength 1600 REC1 в 10 раз быстрее, чем rEC2. Я ищу краткое объяснение.
Что заставляет вас думать, что сложность rec2 is> rec1? Поместите оператор печати в каждый метод и попробуйте запустить их. Например, 'rec1 (« 1234 »)' делает 7 вызовов, тогда как 'rec2 (« 1234 »)' делает 4. – azurefrog
. Проверьте мое редактирование выше, я измерил время с использованием System.nanoTime и попытался понять причину, по которой rec2 быстрее чем rec1. (Даже отключено speedstep) – duketwo
Мой первоначальный ответ был неправильным. Я сейчас обновлен. –