问题
编写一个函数euclidean(x, y, z)求任一点距离原点的欧氏距离,欧氏距离定义如下:三维空间里点a和b的坐标如果分别为()和(),则ab的欧式距离的计算机公式是:
输入输出示例:
输入 1.0, 1.0, 1.0
输出 1.73
提高:尝试不用sqrt函数来实现该功能。
方案:(手撸sqrt)
#使用pow函数自定义一个平方根函数
def sqrt(n):
if n <= 1:
return n
x = n
while True:
root = (x + n/x) / 2
if abs(root - x) < 1e-5:
break
x = root
return round(root, 2)
#欧氏距离函数euclidean(x, y, z)使用pow函数和自定义的平方根函数实现
def euclidean(x, y, z):
distance = sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2))
return round(distance, 2)
#示例输入输出
print(euclidean(1.0, 1.0, 1.0))
sqrt()解释
这段代码定义了一个自定义的平方根函数
sqrt(n)
,通过迭代的方式逼近给定数n
的平方根,并返回计算得到的结果。具体实现过程是:
- 首先判断给定的数
n
是否小于或等于 1,如果小于或等于 1,则直接返回n
。- 将变量
x
初始化为n
,然后进入一个无限循环。在每一次循环中,都计算出n/x
的值,然后将其与x
相加并除以 2,得到迭代公式(x + n/x) / 2
,即可求得新的猜测值root
。- 判断上一次的猜测值
x
与当前猜测值root
的差是否小于一个非常小的误差容限(这里取 1e-5),如果小于该容限,则说明已经得到了足够精确的平方根,退出循环。- 如果上一步判断失败,则继续进行迭代,将当前猜测值
root
赋值给变量x
,再次进入循环继续计算新的猜测值。- 当循环结束时,返回最终计算得到的平方根值,并使用
round
函数对它进行四舍五入,保留两位小数并返回结果。总的来说就是通过迭代逼近计算得到一个数的平方根,这个方法叫做牛顿迭代法(Newton's method)。