我写了以下代码。我试图避免条件句或 while。计算机如何知道它应该运行循环那么多次?。意思是,有什么方法可以让范围函数自动获得该值吗?例如,如果一个人正在寻找 2000 的 sqrt,则以下代码将无法作为从 5 到 10 指定的范围函数运行。我已经快到了,我只是错过了一些东西?
指定范围并不能解决问题
def fun():
fG = n/2
for i in range(5,10):
g = (0.5) * (fG + (n/fG))
fG = g
首先,我不知道当你从不使用变量
for i in range(5, 10)
时,为什么你决定使用i
。 这相当于for _ in range(10)
。
其次,听起来你是在问如何知道正确的迭代次数是多少。 首先,您需要了解有很多数字,牛顿方法永远不会返回精确答案,因此您需要决定您想要多少精度。
一旦您以精度为导向,您可以将代码更改为:
def fun(n, iterations):
fG = n/2
for i in range(iterations):
g = (0.5) * (fG + (n/fG))
fG = g
return g
测量自上次迭代以来测量值发生了多少变化:
def fun2(n, delta):
fG = n/2
iters = 0
while True:
g = (0.5) * (fG + (n/fG))
if abs(fG - g) < delta:
return g, iters
fG = g
iters += 1
然后您可以指定一个很好的模拟来说明您希望与真实值有多接近:
fun2(2000,1) # (44.72230608683239, 6)
fun2(2000, 0.001) # (44.7213595600124, 7)
fun2(2000, 0.000000000000001) # (44.721359549995796, 9)
我不确定您想要实现的目标,但如果我正确理解,以下代码应该可以解决您正在寻找的内容:
import numpy as np # need this to test the custom
# defined function SQRT()
# against numpy's sqrt() function.
# err_epsilon = the acceptable error for stopping the loop.
def SQRT(n, err_epsilon = 1e-8):
fg = n/2
fG = fg + 1
while abs(fg-fG)>err_epsilon:
fg = fG
fG = (0.5) * (fG + (n/fG))
return 0.5*(fG+fg)
# Test against numpy.sqrt()
SQRT(2), np.sqrt(2)
请注意,我们有
err_epsilon=1e-8
,因此应该计算出小数点后 8 位的正确平方根。下面的结果也符合这一点:1.41421356
。事实上,它们直到小数点后第 11 位都是相同的。
(1.4142135623738925, 1.4142135623730951)
由于您更喜欢避免使用
while and/or conditionals
,因此您可以考虑使用以下内容。但是,如果没有评估何时停止计算的条件步骤,您就不可能停止循环。上面给出的实现使用了条件和一段时间(因为您不知道先验需要多少次循环才能达到可接受的错误阈值水平。
您实际上没有在
i
循环中使用变量for
。因此,如果您决定将 for
循环与
range
函数一起使用,最好放弃它的值。
def fun(n, start = 0, stop = 10, step = 1):
fG = n/2
# we skip saving the variable generated
# from the range iterator.
for _ in range(start,stop,step):
fG = (0.5) * (fG + (n/fG))
return fG
平方根算法
:
def BabylonianAlgorithm(number):
if(number == 0):
return 0;
g = number/2.0;
g2 = g + 1;
while(g != g2):
n = number/ g;
g2 = g;
g = (g + n)/2;
return g;
print('The Square root of 0.3 =', BabylonianAlgorithm(0.3));
S = 1234 # Any number you like
ans = S/2
x = 0.0
for _ in range(64):
ans = (ans + x)/2
x = S / ans
print(f"The square root of {S} is {ans:.7f}")
输出:
The square root of 1234 is 35.1283361
并且:
The square root of 2 is 1.4142136