because power(base, exponent) has no return value unless exponent is 0, initially, shouldn't power(base, exponent -1) return 'undefined', and therefore be unmultipliable, initially? So, I am having trouble following the logic of this code. Why/how does it work?
function power(base, exponent) {
if (exponent == 0)
return 1;
else
return base * power(base, exponent - 1);
}
A recursive function must have a condition to stop calling itself. Otherwise, the function is called indefinitely. Once the condition is met, the function stops calling itself.
Example: Program to Computer Power Using Recursion This technique can only calculate power if the exponent is a positive integer. To find power of any number, you can use pow() function. result = pow(base, exponent);
The recursive power function, power(base,exponent), must recursively calculate the value of the power and then return it.
Look at what happens if you try to calculate 5^3
:
power(5, 3) ... this should give us 125, let's see if it does...
function power(base, exponent) { // base = 5, exponent = 3
if (exponent == 0) // nope, exponent != 0
return 1;
else
return base * power(base, exponent - 1); // return 5 * power(5, 2)
}
... what is power(5, 2)
? ...
function power(base, exponent) { // base = 5, exponent = 2
if (exponent == 0) // nope, exponent != 0
return 1;
else
return base * power(base, exponent - 1); // return 5 * power(5, 1)
}
... what is power(5, 1)
? ...
function power(base, exponent) { // base = 5, exponent = 1
if (exponent == 0) // nope, exponent != 0
return 1;
else
return base * power(base, exponent - 1); // return 5 * power(5, 0)
}
... what is power(5, 0)
? ...
function power(base, exponent) { // base = 5, exponent = 0
if (exponent == 0) // yup, exponent != 0
return 1; // return 1
else
return base * power(base, exponent - 1);
}
... putting that together, in reverse order as we walk back up the stack...
power(5, 0) = returns 1
power(5, 1) = 5 * power(5, 0) = 5 * 1 = returns 5
power(5, 2) = 5 * power(5, 1) = 5 * 5 = returns 25
power(5, 3) = 5 * power(5, 2) = 5 * 25 = returns 125
... so, power(5, 3) returns 125, as it should.
It could be more concise:
function power(base, exponent) {
return exponent == 0? 1 : base * power(base, --exponent);
}
Howerver an iterative solution is very much faster:
function powerNR(base, exp) {
var result = 1;
while(exp--) {
result *= base;
}
return result;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With