2

「このループを、a をパラメーターとして取り、x の適切な値を選択し、a の平方根の推定値を返す square_root という関数にカプセル化します。」

def square_root(a):
    x = 2 
    y = (x + a/x) / 2
    epsilon = 0.00000000001
    if abs(y - x) < epsilon:
        print y
    while abs(y - x) > epsilon: 
        x = x + 1
        y = (x + a/x) / 2
        break
    else:
        return
    print y     
square_root(33)

'a' に 33 を入力するまで、正しい平方根を推定します。その後、指数関数的にジャンプを開始し、「a」に 100 を送信すると、平方根が約 18 であると推測するところまで到達します。これが推定の性質であるかどうかはわかりません。正確な平方根を見つける方法は知っていますが、これは本「Think Python」の演習であり、再帰とアルゴリズムの思考を練習することです。

4

4 に答える 4

3

xループ本体で 1ずつ増やしてはいけません。xに設定する必要がありますy(ウィキペディアの記事x3を見て、 にどのように依存しているかなどに注意してくださいx2):

while abs(y - x) > epsilon:
    x = y
    y = (x + a/x) / 2

ループが無意味breakになるので、それも取り除きたいです。while最終的なコードは次のようになります。

def square_root(a):
    x = 2 
    y = (x + a/x) / 2
    epsilon = 0.00000000001
    if abs(y - x) < epsilon:
        print y
    while abs(y - x) > epsilon: 
        x = y
        y = (x + a/x) / 2
    print y

しかし、まだ改善の余地があります。これが私がそれを書く方法です:

def square_root(a, epsilon=0.001):
    # Initial guess also coerces `a` to a float
    x = a / 2.0

    while True:
        y = (x + a / x) / 2

        if abs(y - x) < epsilon:
            return y

        x = y

また、Python の浮動小数点型は無限の精度を持たないため、いずれにしても約 15 桁の精度しか取得できないため、次のように削除することもできますepsilon

def square_root(a):
    x = a / 2.0

    while True:
        y = (x + a / x) / 2

        # You've reached Python's max float precision
        if x == y:
            return x

        x = y

しかし、y が 2 つの値の間で振動する場合、この最後のバージョンは終了しない可能性があります。

于 2013-06-20T05:49:21.353 に答える
0

とても簡単です。x = a を取り、次のように中性子の式に従います。

def square_root(a):
x = a
while True:
    print x
    y = (x+a/x)/2
    if abs(y-x) < 0.0000001:
        break
    x = y
于 2016-03-08T15:38:32.950 に答える
0

より抽象的に作成したい場合は、十分ですか?プリミティブとして推測..ここでSICPの古典的なテキストを参照してください http://mitpress.mit.edu/sicp/full-text/sicp/book/node108.html

于 2013-06-20T07:58:45.800 に答える