2016-10-12 10 views
1

私はPythonとstackoverflowの初心者です。私は平方根近似のためのPyschoolのwhileループの例を解決しようとしています(トピック5:質問9)。しかし、私は希望の出力を得ることができません。この問題がループや数式に関連するかどうかはわかりません。ここで質問です:pyschools平方根近似

は正の数にとる関数を作成し、数が2つの 整数の二乗との間になるように、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でそれを呼び出すと、私が手アウトプットut (2, 0)

私が間違っていることを教えてもらえますか?前もって感謝します。

+0

空白行で始まる書式を指定し、各行の先頭に4つのスペースを追加し、最後に空白行を残します – Amias

+1

'minsq'と' maxsq'を忘れずに '(i- 1、i) 'または'(i-1、i-1) '(それが完全な正方形であるかどうかに応じて)?あなたがする必要があるのは、最後の 'i'を' i * i <= num'で見つけて、それを1行whileループで行うことだけです。 –

答えて

1

あなたのコードは、それが何をするかない理由です:

ラインmaxsq = minsqが実行された後、我々は最初のループに

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 

を来るときそれらの値の両方が1

ですループ内にはi*i<=numがあるので、再テストする必要はありません。したがって介して後続のパスでは0であるiの現在値に等しいmaxsqを設定し、第2の条件が真作るループi == 0しかしmaxsq == 1介して最初のパスにおいて

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

:したがって、と等価ですループ、i <= maxsqは偽(maxsq == 0以降はi > 0)ので、maxsqは決して0を超えて移動しません。一方、whileループの最初の条件は、minsqを意図したとおりに更新し続けます。

minsqmaxsqの両方を完全に忘れることをお勧めします。ループは単純に持っている:

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

ループの実行が完了したら、i-1を含む簡単なテストを返すために何を決定するのに十分です。

+0

ありがとうございました。 –