考虑如何指定函数的输出power(base, exp)
。
对于 base b
,我们指定以下内容:
power(b, 0) = b^0 = 1
power(b, 1) = b^1 = b
power(b, 2) = b^2 = b * b
power(b, 3) = b^3 = b * b * b
...
power(b, n) = b^n = b * b * ... * b (n times)
请注意,每次我们将指数增加一时,我们将结果乘以b
得到新结果。一般来说,我们可以使用以下两条规则生成整个序列:
b^0 = 1
对全部b
b^n = b^(n-1) * b
对于所有正整数n
这两个规则直接转换为您提供的函数定义。
public static double power(double baseNum, int exp)
{
if (exp == 0) /* when the exponent is zero, the result is always 1. */
return 1;
else /* otherwise, the power is equal to b^(n-1) * b. */
return baseNum * power(baseNum, --exp);
}
当您从正整数指数开始时,我们使用规则 2 根据较小的指数计算结果,直到我们到达指数零 - 当我们知道结果应该始终为 1 时(使用规则 1)。
最后,几点说明。
在该else
子句中,简单地显示减法而不是使用前置增量会更清楚。也就是说,考虑使用:
return baseNum * power(baseNum, exp - 1); /* exp - 1 instead of --exp */
如果exp
传递给你的函数是负数,它可能会在递归调用自身太多次并耗尽内存后崩溃。
如果您希望该函数考虑负索引,您仍然可以使用递归调用,除了反转我们的递归规则以使指数向零移动:
public static double power(double base, int exp)
{
if (exp == 0)
return 1;
else if (exp < 0)
return power(base, exp + 1) / base;
else
return power(base, exp - 1) * base;
}