一、题目概述
二、思路方向
方法1:递归(考虑正负n)
这种方法利用递归的思想,将问题分解为更小的子问题。同时,考虑到n可能是负数,我们可以先处理n的符号,然后将问题转化为正数幂的问题。
public class Solution {
public double myPow(double x, int n) {
long N = n; // 转换为long避免溢出
if (N < 0) {
x = 1 / x;
N = -N;
}
return powHelper(x, N);
}
private double powHelper(double x, long n) {
if (n == 0) return 1;
if (n % 2 == 0) {
double half = powHelper(x, n / 2);
return half * half;
} else {
return x * powHelper(x, n - 1);
}
}
}
方法2:迭代
迭代方法相比于递归,在处理大数时可能更加高效,因为它避免了递归栈的开销。
public class Solution {
public double myPow(double x, int n) {
long N = n;
if (N < 0) {
x = 1 / x;
N = -N;
}
double result = 1.0;
while (N > 0) {
if (N % 2 == 1) {
result *= x;
}
x *= x;
N /= 2;
}
return result;
}
}
方法3:使用Math库(简单但不满足题目要求)
虽然这不符合题目“实现”的要求,但在实际应用中,我们可以直接使用Java的Math库来完成这个任务。
public class Solution {
public double myPow(double x, int n) {
if (n < 0) {
return 1 / Math.pow(x, -n);
}
return Math.pow(x, n);
}
}
但请注意,这种方法虽然简单,但并不符合题目要求我们自己实现
pow
函数的意图。
执行结果:
三、小结
在面试或实际编程中,推荐使用递归或迭代的方法来实现
pow
函数,因为这两种方法不仅锻炼了我们的编程能力,还能更好地处理极端情况(如大数幂)和性能问题。而直接使用Math库虽然简单,但缺乏了编程的乐趣和深度。
结语
生命太短
没留时间给我们每日带着遗憾醒来
!!!