почему это более эффективно?

#javascript #performance

Вопрос:

почему «code01» более эффективен, чем «code02»? похоже, что оба кода все еще получают остаток после завершения всей операции.

 // code01  function power(base, exponent) {  if (exponent === 0) return 1;   const half = parseInt(exponent / 2);  const temp = power(base, half);  const result = (temp * temp) % 94906249;   if (exponent % 2 === 1) return (base * result) % 94906249;  else return result; }  
 //code02  function power(base, exponent) {  if (exponent === 0) return 1;   return base * power(base, exponent - 1) % 94906249; }  

Ответ №1:

Первый использует exponent / 2 в рекурсии, второй exponent - 1 .

Повторное деление дает вам логарифмическое время выполнения, повторное вычитание дает вам линейное время выполнения.

Сравнить:

деление вычитание
8 8
4 7
2 6
1 5
. 4
3
2
1
.

Деление с коэффициентом 2 означает 4 шага для ввода 8, 5 шагов для ввода 16, 11 шагов для ввода ~1000. Вычитание 1 означает 1000 шагов для ввода 1000. 11 намного меньше 1000.