Я нашел итеративный реализацию Pow (х, п), которая принимает O (журнал п) и постоянное место, как показано ниже:Итерационный реализация мощн (х, п)
double pow(double x, int n) {
double left = x;
double right = 1;
if (n<0) return 1/(x*pow(x,-n-1)); // Avoid binary overflow!!!!
if (!n) return 1;
while (n>1)
{
if (n%2==1) right *= left;
left = left * left;
n = n/2;
}
return left * right;
}
Но я не мог найти какое-либо объяснение этого алгоритма. Я понимаю рекурсивное решение с использованием техники разделения и покорения, и я предполагаю, что это решение использует подобный трюк. Но я не понимаю, почему это работает. Может ли кто-нибудь объяснить этот алгоритм мне? Спасибо!
[Вознесение по квадрату] (http://en.m.wikipedia.org/wiki/Exponentiation_by_squaring) –
Возможный дубликат [Эффективный способ вычисления p^q (экспоненциальность), где q - целое число] (http: //stackoverflow.com/questions/5625431/efficient-way-to-compute-pq-exponentiation-where-q-is-an-integer) –
@ TheParamagneticCroissant Спасибо за вашу ссылку! Действительно полезно! – eaglesky