leetcode-050-Pow

1. 题目

实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

2.解

递归解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
if n == 0:
return 1
if n < 0:
return 1 / self.myPow(x,-n)
# 分治法
# 这是一个倒三角的计算过程
# 顶层为所有的x,两两相乘之后的结果下降一层,这时x的n次方就转换为(x*x)的n/2次方
# n分为奇数和偶数的情况
if n % 2 == 1:
return x * self.myPow(x,n-1)
else:
return self.myPow(x*x,n/2)

非递归解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
flag = 1
if n < 0:
flag = 0
n = -n
res = 1
# 思路和递归的是一样的,用n次方作为循环的条件
# n为奇数时,n = n-1
# n为偶数时,n = n/2
# 不论初始的n是奇数还是偶数,最终都会停止在n=1上,
# 所以在所有满足n%2=1的时候,都用res去乘,res会记录最终的值
while n:
if n % 2 == 1:
res = res * x
n = n-1
else:
x = x*x
n = n/2
if flag == 1:
return res
else:
return 1 / res