2017-01-14 8 views
0

私はPython 2.7.12を使用しています。私が勉強しているアルゴリズムの本はPython 3を使っています。今まで、ほとんどのアルゴリズムをPython 2に簡単に変更できることが分かっていましたが、この平方根関数はニュートンの法則を使ってもまだ私を逃しています。ここでPython 3関数をPython 2.7.12で動作させることはできません

は、私はPythonの2.7.12で関数を呼び出すしようとすると、元のPythonで3

def square_root(n): 
    root = n/2 #initial guess will be 1/2 of n 
    for k in range(20): 
     root = (1/2) * (root + (n/root)) 
    return root 

そして、ここではエラーになり、コードです:

print square_root(9) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in square_root 
ZeroDivisionError: integer division or modulo by zero 

私は思いますPython 2.7用にこの関数を書く方法を知りたいのです。

答えて

3

/の除算は、両方のオペランドが整数の場合は整数除算を行います。 1/20です。 Python 3では、/は常に適切な除算を行い(1/2 == 0.5)、//は整数除算を行います。

from __future__ import divisonをスクリプトの先頭に追加すると、Python 3の動作が得られます。

+1

を:)多分それは、Python 3に、この操作は、適切な部門になったと私は気づいたフロート – hansaplast

+0

をもたらし、行っていることを追加する価値があります:) – RemcoGerlich

+1

したがって、__future__から除算をインポートする必要はなく、(1/2)の代わりにn/2.0と0.5を使用するだけです。 :D – Dalen

1

Python 2の2つの整数の除算は常に整数になりますが、Python 3では浮動小数点になります。アルゴリズム、フロートオペランドを使用するための力のpython修正するには:あなたは3秒で私を倒す

def square_root(n): 
    root = n/2.0 #initial guess will be 1/2 of n 
    for k in range(20): 
     root = (1.0/2) * (root + (n/root)) 
    return root 
関連する問題