2016-12-14 4 views
0

なぜ次のコードが終了しないのですか?2の平方根を計算する

# approximating sqrt(2) 

def approx (error,left, right): 
    c = (left+right)/2 
    f = c**2 - 2 

    if abs(f)<error : 
     return c 

    if f < 0: 
     left = c 
    else: 
     right = c 

    return approx(error,left,right) 

print approx(0.1,0,2) 
+0

デバッガを使用してみてください:コードをステップ実行し、何が起こるかを確認してください。 – Blorgbeard

+0

また、再帰の必要はありません。真の間にコードの本体を入れてください: '。 – Blorgbeard

答えて

3

あなたは、この行に精度を失う可能性があります:

c = (left+right)/2 

leftrightは両方とも整数である場合、cも整数になります。これは予期しない動作につながります。たとえば1/20と評価されます。

あなたはフロートで割ることでフロートする結果を強制することができます

c = (left+right)/2.0 
をそれとも、Pythonの3.Xに切り替えることができ、それが自動的に通常の賢明な部門を使用します。

+0

ありがとう、これは動作します。これは実際には直感的な反対です。 – Epsilon

+1

...将来的に部門をインポートする:https://www.python.org/dev/peps/pep-0238/ – danihp

+1

@Epsilonの整数部は結果をフロアします。これはちょっと標準的なプログラミング言語の動作です –