我是Python和stackoverflow的新手。我一直在尝试为平方根近似解Pyschools的“ while循环”示例(主题5:问题9)。但是,我无法获得所需的输出。我不确定此问题是否与循环或公式有关。这是问题:


  创建一个接受正数并返回2的函数
  整数,使得数字介于2的平方之间
  整数。如果数字是一个平方,则它将返回两次相同的整数
  整数
  
  


例子:

sqApprox(2)
(1, 2)
sqApprox(4)
(2, 2)
sqApprox(5.1)
(2, 3)


这是我的代码:



def sqApprox(num):
    i = 0
    minsq = 1                           # set lower bound
    maxsq = minsq                       # set upper bound
    while i*i<=num:                     # set 'while' termination condition
        if i*i<=num and i >=minsq:  # complete inequality condition
            minsq = i
        if i*i<=num and i <=maxsq:  # complete inequality condition
            maxsq = i
        i=i+1                       # update i so that 'while' will terminate
    return (minsq, maxsq)




如果创建此函数sqApprox(4)并在IDE上调用它,则会得到输出(2, 0)

有人可以让我知道我做错了吗?提前致谢。

最佳答案

这就是您的代码执行其操作的原因:

在执行maxsq = minsq行之后,这两个值均为1。

当我们来到循环中

while i*i<=num:                     # set 'while' termination condition
    if i*i<=num and i >=minsq:  # complete inequality condition
        minsq = i
    if i*i<=num and i <=maxsq:  # complete inequality condition
        maxsq = i
    i=i+1                       # update i so that 'while' will terminate


首先请注意在循环i*i<=num中,因此无需重新测试。因此,它等效于:

 while i*i<=num:
     if i >=minsq:
         minsq = i
     if i <=maxsq:
         maxsq = i
     i=i+1


在第一次通过循环i == 0maxsq == 1时,使第二个条件成立,因此将maxsq设置为等于i的当前值,即0。在随后的循环中,i <= maxsq为false(因为maxsq == 0i > 0),因此maxsq永远不会移到0以上。另一方面,while循环中的第一个条件将按预期更新minsq

我建议完全忘记minsqmaxsq。让循环简单地是:

while i*i <= num:
    i += 1 #shortcut for i = i + 1


执行完循环后,一个包含i-1的简单测试就足以确定要返回的内容。

10-04 17:07