Вы фактически вызываете 2 вызова функции из каждого вызова. Дерево рекурсии было бы двоичным деревом высотой log(exponent)
, поэтому число узлов в нем будет 2^log(exponent) == exponent
. Таким образом, в целом это становится линейным алгоритмом. Вы можете переписать его так, чтобы повысить производительность:
int findPower(int base, int exponent){
if( 0 == exponent ) return 1;
int temp = findPower(base, exponent/2);
if(exponent % 2 == 0) return temp * temp;
return temp * temp * base;
}
Хитрость в том, что вы должны сохранить значение findPower(base, exponent/2)
, чтобы получить логарифмическую сложность. Дерево рекурсии по-прежнему имеет высоту log(exponent)
, но у каждого узла теперь только один дочерний элемент, поэтому будет log(exponent)
узлов. Если вы на самом деле вызовете его дважды, это ухудшит производительность даже более, чем линейную. Нет необходимости вычислять одно и то же значение во второй раз, если оно у вас уже есть!
Как заметил @David Schwartz, количество вызовов, сделанных в вашем коде, удвоится, если exponent
удвоится. Но когда вы сохраняете значения, удвоение exponent
делает только один больше вызовов.