pyschools平方根近似

时间:2016-10-12 10:06:38

标签: python

我是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)

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

1 个答案:

答案 0 :(得分:1)

这就是为什么你的代码能够做到的:

执行第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 == 0但是maxsq == 1时,使第二个条件为真,因此将maxsq设置为等于i的当前值,即0在随后的循环遍历中,i <= maxsq为假(因为maxsq == 0但是i > 0)因此maxsq永远不会超过0。另一方面,第一个条件是while循环不断按预期更新minsq

我建议完全忘记minsqmaxsq。循环只是:

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

当循环完成执行时,涉及i-1的简单测试足以确定返回的内容。