題目:實(shí)現(xiàn)函數(shù)double Power(double base, int exponent),求base的exponent次冪。不得使用庫函數(shù)阔逼,同時不需要考慮大數(shù)問題.
常規(guī)解法
func power(base:Double,exponent:Int) -> Double {
if base == 0 {
return 0
}
if exponent == 0 {
return 1
}
let num:Int = exponent > 0 ? exponent :abs(exponent)
let result:Double = self.multiWithExponent(base: base, exponet: num)
//let result:Double = self.multiWithExponentRecursion(base: base, exponet: num)
//let result:Double = self.multiWithExponentNormal(base: base, exponet: num)
if exponent < 0 {
return 1.0/result
}
return result
}
func multiWithExponent(base:Double,exponet:Int) -> Double {
var result:Double = 1
for _ in 0..<exponet {
result *= base
}
return result
}
遞歸解法
計(jì)算結(jié)果可以通過遞歸減少循環(huán)的次數(shù),注意奇偶數(shù)判斷.
func multiWithExponentRecursion(base:Double,exponet:Int) -> Double {
if exponet == 0 {
return 1
}
if exponet == 1 {
return base
}
var result:Double = self.multiWithExponent(base: base, exponet: exponet>>1)
result *= result
if (exponet & 1) == 1 {
result *= base
}
return result
}
非遞歸解法
// 非遞歸
func multiWithExponentNormal(base:Double,exponet:Int) -> Double {
var result:Double = 1.0
var tempBase:Double = base
var tempExponet:Int = exponet
while tempExponet > 0 {
if (tempExponet & 1) == 1{
result *= tempBase
}
tempBase *= tempBase
tempExponet = tempExponet>>1
}
return result
}