如何在Python中仅使用“for循环”编写牛顿平方根方法?没有条件

问题描述 投票:0回答:3

我写了以下代码。我试图避免条件句或 while。计算机如何知道它应该运行循环那么多次?。意思是,有什么方法可以让范围函数自动获得该值吗?例如,如果一个人正在寻找 2000 的 sqrt,则以下代码将无法作为从 5 到 10 指定的范围函数运行。我已经快到了,我只是错过了一些东西?

指定范围并不能解决问题

def fun():       
    fG = n/2
    for i in range(5,10):
        g = (0.5) * (fG + (n/fG))
        fG = g
python
3个回答
0
投票

首先,我不知道当你从不使用变量

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)

0
投票

我不确定您想要实现的目标,但如果我正确理解,以下代码应该可以解决您正在寻找的内容:

解决方案

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

平方根算法

假设您正在尝试求平方根,我鼓励您看一下这些:

  1. 巴比伦算法的平方根:Python 实现 [1]
  2. 编写自己的平方根函数
  3. 使用牛顿法求平方根(错误!)重要
  4. 用牛顿法Python实现平方根
  5. Python 中的牛顿平方根法
引用

[1]as-is

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));
    

0
投票
你可以多次找到根部:

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
    
© www.soinside.com 2019 - 2024. All rights reserved.