【问题标题】:square root n by computing the next Xi term通过计算下一个 Xi 项来平方根 n
【发布时间】:2026-01-18 12:45:01
【问题描述】:

我被教科书上的一个问题困住了。它问:

使用公式Xk+1 = 1/2 * (Xk + n/(Xk) 编写您自己的平方根近似函数,其中X0 = 1

这个等式表示可以通过重复计算下一个 Xi 项来找到 sqrt'n'。使用的术语数量越多,答案就越好。允许您的函数有两个输入参数,即您想要平方根的数字和要计算的项数。'

我为此使用 Python3.5.2。

谢谢!

【问题讨论】:

标签: python square-root function-approximation


【解决方案1】:

新学年,古老的巴比伦方法。

所以,我不会为你解决这个问题,但我可以让你开始。

我们可以编写一个小函数来计算每个x_{k+1}

def sqrt_step(n, xk):
    return 1/2.0 * (xk + float(n)/xk)

让我们设置n = 100

sqrt_step(100, 1) # returns 50.5

现在让我们再将这个数字输入函数几次:

sqrt_step(100, 50.5) # 26.2

sqrt_step(100, 26.2) # 15.0

sqrt_step(100, 15.0) # 10.8

...随着k 趋于无穷大,它收敛到 10。

现在,如果有一种方法可以一遍又一遍地执行操作k 次...我正在考虑一个以“f”开头并与“ore”押韵的三个字母单词...


编辑

您为解决问题做出了诚实的努力——我将假设这是一项家庭作业练习,而不是 一个任务。

您可以简单地通过在新函数中使用sqrt_step 函数来解决这个问题。这可以按如下方式完成:

def square_root(n, k): 
    xk = 1
    for i in range(k): 
        xk = sqrt_step(n, xk) # or just: xk = 1/2.0 * (xk + float(n)/xk)
    return xk

测试:

square_root(64, 100)  # 8.0
square_root(144, 100) # 12.0

随着您的进步,您将学习函数式编程技术,这些技术可以让您避免覆盖变量和显式编写for 循环。然而,就目前而言,这是最直接的方法。

【讨论】:

  • 感谢 InNoam 回复我的帖子并帮助我入门。我仍然无法想象如何一遍又一遍地重复此操作 k 次。我将向您展示我到目前为止所做的尝试。 def sqrt_step(n,xk): return 1/2.0* (xk + float (n)/xk) # 正如你提到的,我尝试重复这 k 次: def sqrt_step(n,xk): for xk in range(xk, 1,-1): return 1/2.0* (xk + float (n)/xk) 我的推理是重复 xk 直到它达到 1,每次减 1。
  • 在数学中,我们称这种方法为explicit,因为x_{k+1}只取决于我们知道x_{k}。在英语中,这意味着最重要的是知道上一步得到的value。因此,尝试设置xk = 1 的值并运行sqrt_step() 函数,然后用它替换 xk(虽然这违反了一些被称为“不变性”的编程原则,这是最简单的入门方法)。您需要for 循环来简单地告诉计算机多少次 覆盖xk 的值。任何给定步骤的实际索引都不是特别相关。
  • 我想我做到了!你很有帮助,也是最好的。我不知道如何在这里格式化我的评论,但我认为我把它复杂化了,起作用的只是设置:for i in range(1,10): between the other lines.
  • 我不能说这是正确的方法:)。要了解如何格式化您的代码,请单击 here。对于 Python 中另一个很酷的数学示例,定义 s = 0 然后运行 ​​for n in range(1, 250): s += 1/(n**2)。这将返回s = 1.64...现在,查找(pi^2)/6 的值。虽然您需要大量花哨的数学来证明这是真的,但您可以通过几行代码来暗示它是正确的。计算的力量。祝你学习顺利!
  • 再次感谢您的帮助。 sqrt_step 函数有没有办法根据分配给“xk”参数的数字计算任何数字的平方根?我想我目前设置它只是为了找到 100 的平方根。当我设置“({n = 1000})”和“({xk = 100})”时,我返回55.0。