递归
问题描述:
求x的n次方
power(x, n)
,如power(2,4) = 16
。思路:
很直接的思路,x与自己相乘n次的结果,事假复杂度为O(N)。这个方法有个问题:很多的重复计算。以power(2,4)为例,power(2,4) = (2x2)x(2x2)。(2x2)被计算了两次,当n很大时,就会由更多的重复计算。其实power(2,4) = power(2,2)xpower(2,2)。所以可以很容易写出递归的主体:
1
2double half = power(x, n/2);
double res = half*half;时间复杂度为O(logN)。而递归终止条件和其他细节可从下图中自然得到:
【过程图】
实现:
由过程图可以实现如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17double myPow3(double x, int n){
// 递归终止条件:
if (n==0) return 1.0;
// 特殊情况:
if (x==0.0) return 1.0;
long long int nn=n;
// 当x为负数
if(nn<0){
nn=-nn;
x=1/x;
}
// 递归主体:
double half = myPow3(x, nn/2);
double ans = half*half;
// 这个细节在过程图中很容易看出:
return n%2==0 ? ans : ans*x;
}
敲黑板:递归直接写很容易出错,把过程图画出来,一些细节就会很容易发现。