【问题标题】:How to write Newton's Square Root method using only "for loop" in Python? No conditionals如何在 Python 中仅使用“for 循环”编写牛顿平方根方法?无条件
【发布时间】:2019-09-16 11:59:06
【问题描述】:

我编写了以下代码。我试图避免条件或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


【解决方案1】:

首先,我不确定你为什么决定使用for i in range(5, 10),而你从未使用过变量i。这相当于for _ in range(10)

其次,听起来您在问如何知道正确的迭代次数是多少。首先,您需要了解有很多数字,newtons 方法永远不会返回 exact 答案,因此您需要确定所需的精度。

一旦您以精确为导向,您就可以从以下位置更改您的代码:

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)

【讨论】:

    【解决方案2】:

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

    解决方案

    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,因此您可以考虑使用以下内容。但是,如果没有评估何时停止计算的条件步骤,您不可能停止循环。上面给出的实现利用了条件和时间(因为你不知道先验需要多少循环才能达到可接受的错误阈值水平。

    您实际上没有在for 循环中使用变量i。因此,如果您决定将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. Square Root with Babylonian Algorithm: Python Implementation [1]
    2. Writing your own square root function
    3. Finding the square root using Newton's method (errors!)重要
    4. Python Implementation of Square Root with Newton's Method
    5. Newton Square Root Method in 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));
    

    【讨论】:

    • 我在理解你的问题时可能是错误的。如果是这种情况,请添加更多带有预期结果的解释,我们可以制定可行的解决方案。
    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2021-12-09
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多