leetcode 50. Pow(x, n)
递归:
class Solution { public: double myPow(double x, int n) { if(n==0) return 1; if(n<0) return 1/myPow(x,-n); if(n&1==0) return myPow(x*x,n/2); return x*myPow(x,n-1); } };
迭代:
class Solution { public: double myPow(double x, int n) { double res=1.0; int p=n; while(p){ if(p&1==1) res*=x; p/=2;if(p==0) break; x*=x; } return n>0?res:1/res; } };
这道题目应该使用迭代方法,因为使用递归方法会出现stack overflow(并不是说递归的代码是错误的,事实上递归的代码大多数样例可以正确运行)
正确的递归如下:
/** 递归法:O(logn) **/ class Solution { public: double myPow(double x, int n) { if (n==0) return 1; double t = myPow(x,n/2); if (n%2) { return n<0 ? 1/x*t*t : x*t*t; } else { return t*t; } } };