这道题实际上是我在实际面试过程中被考到的一道题,个人觉得比较值得记录一下。
题目要求:计算给定数字的立方根,并且保留小数点后两位。
解法一 :二分法
求立方根的问题实际上就是在1~给定数字之间找到一个数,让这个数的立方为给定数字,由此转化为了一个查找问题。
话不多说,二分查找还是很容易理解滴,只需要注意如何保留小数点后2位就可以了,上代码
def getCube1(input):
lo = 1
hi = input
mid = lo
while hi - lo > 0.0001:
mid = (hi + lo) / 2
cube = mid * mid * mid
if cube > input:
hi = mid
elif cube < input:
lo = mid
else:
return mid
return float(("%.3f") % mid)
解法二:牛顿迭代法
非常有逼格有品位的方法,该方法源于数值分析,是展现你高超的编程与算法能力的解决方案。
首先了解什么是牛顿迭代法
比如我们求一个函数,假设是该方程的一个近似解,那么将在处进行泰勒展开,得到
取前两项来代替,则得到近似的线性方程
那么就可以得到牛顿迭代的迭代式
当与相差在可以接受的范围是,就可以说前者是的近似解
那么回到本问题,我们要求解的是给定数字的立方根,那么这个问题实际上就是解决的解,其中n就是给定的数字,转化为牛顿迭代式也就是,这样牛顿迭代法求解立方根的思路也就清晰了,上代码
def getCube2(input):
last = input
new = last - (last*last*last - input)//(3.0*last*last)
while abs(new - last) > 0.0001:
last = new
new = last - (last*last*last - input)/(3.0*last*last)
return float(("%.3f") % new)
为什么使用牛顿迭代?
牛顿迭代法的速度要相对于二分法快
import time
time1 = time.clock()
print(getCube1(12345678))
time2 = time.clock()
print(time2 - time1)
time1 = time.clock()
print(getCube2(12345678))
time2 = time.clock()
print(time2 - time1)
231.12
0.0001688110005488852
231.12
0.00014979700063122436
因此使用牛顿迭代法解决方根问题也是常用的算子优化方法之一。