Python二分法求平方根 - 求任意方根
程序员文章站
2022-06-17 19:45:52
...
如上图,开方函数
y
=
x
1
n
y = x^\frac{1}{n}
y=xn1 是幂函数,且在定义域内单调递增,当 n 为偶数时,定义域在 [0,+
∞
\infty
∞);当 n 为奇数时,定义域在(-
∞
\infty
∞,+
∞
\infty
∞)
二分法原理:
以二分法求 2 \sqrt{2} 2 为例,1的平方等于1,2的平方等于4,4 > 2,因为函数单调递增,所以 2 \sqrt{2} 2 的值肯定是在(1,2)之间,然后取中间数1.5,而1.5的平方等于2.25,2.25 > 2,进一步缩小范围, 2 \sqrt{2} 2 的值肯定是在(1,1.5)之间,再取中间数1.25,1.25的平方等于1.5625,1.5625 < 2,则 2 \sqrt{2} 2 的值肯定是在(1.25,1.5)之间,依次类推就可以一步步的逼近真实值。
""" num:被开方的数 lower:区间更小的值, 这里初始值设置为0
upper:区间更大的值 error: 允许的误差值 power: 开几次方根 """
def root(num, upper, lower=0, error=0.01, power=2):
# 先用两个区间边界判断是否符合,省得递归,比方说求根号1的值,直接就可以得到1
if abs(upper ** power - num) <= error:
return upper
if abs(lower ** power - num) <= error:
return upper
result = (lower + upper) / 2 # 取中间值
if abs(result ** power - num) <= error: # 如果中间值的次方在误差内,就可以返回结果了
return result
if result ** power > num: # 如果中间值的次方不在误差内,根据结果缩小区间,递归
return root(num, result, lower)
else:
return root(num, upper, result)
if __name__ == '__main__':
for i in range(1, 11):
# 这里暂时不考虑负数
# 分数的开方的要比它本身小,使得结果不在区间中,没办法用二分法
# 所以当i为分数时,取更大的值为1,当i不是分数时,取本身的值就可以了,因为本身的值的次方一定是大于等于本身的
upper = max(i, 1)
print('root(%d) = %.5f' % (i, root(i, upper)))
输出:
root(1) = 1.00000
root(2) = 1.41406
root(3) = 1.73438
root(4) = 2.00000
root(5) = 2.23633
root(6) = 2.44922
root(7) = 2.64551
root(8) = 2.82812
root(9) = 3.00146
root(10) = 3.16162
上一篇: acwing 786. 第k个数
下一篇: Leetcode - 环形链表