3

Heron の方法は、 √nのより適切な近似を表す一連の数値を生成します。シーケンスの最初の数字は任意の推測です。シーケンス内の他のすべての数値は、次の式を使用して前の数値prevから取得されます。

    (1/2)*(prev+n/prev)

nerrorheron()の 2 つの数値を入力として受け取る関数を作成することになっています。関数は、 √nの初期推定値 1.0で開始し、連続する近似間の差 (より正確には、差の絶対値) が最大でerrorになるまで、より良い近似を繰り返し生成する必要があります。

    usage:
    >>> heron(4.0, 0.5)
    2.05
    >>> heron(4.0, 0.1)
    2.000609756097561

これは少し難しいですが、次の 4 つの変数を追跡する必要があります。

    # n, error, prev and current

条件付きのwhile ループも必要です。

    ((current - prev) > error):

whileループの一般的なルールは次のとおりです。

    # old current goes into new prev

だから、これは私がこれまでに得たものです。最初はwhileループの下に「if」ステートメントを組み込む方法がわからないため、それほど多くはありません。

def heron(n, error):
    guess = 1
    current = 1
    prev = 0
    while (current - prev) > error:
        previous==1/2*(guess+n/guess):
           print (previous) # just a simple print statement
                            # in order to see what i have so far

誰かが正しい方向へのいくつかの指針を教えてもらえますか?

ありがとうございました

4

5 に答える 5

4

ジェネレーターを使用したくない場合、最も簡単な方法は次のとおりです。

def heron(n, error):
    prev, new = 1.0, 0.5 * (1 + n)
    while abs(new - prev) > error:
        prev, new = new, 0.5 * (new + n/new)
    return new

ヘロン番号の「無限」シーケンスを生成することもできます。

def heron(n):
    prev = 1.0
    yield prev, float('inf')
    while True:
        new = 0.5 * (prev + n/prev)
        error = new - prev
        yield new, error
        prev = new

これで、好きなだけ多くの数字を印刷できます。たとえば、次のようになります。

list(islice(heron(2), 3))     # First 3 numbers and associated errors

エラーが 0.01 より大きい限り生成します。

list(takewhile(lambda x:x[1] > 0.01, heron(2)))
于 2013-05-17T23:50:06.973 に答える
1

@elyaseの答えに基づいて構築するために、提供されたヘロン数ジェネレーターから任意精度の平方根を取得する方法を次に示します。(ジェネレーターは、サギ シーケンスの次の番号を与えるだけです)

def heron(n): ### posted by elyase
    a = 1.0
    yield a
    while True:
        a = 0.5 * (a + n/a)
        yield a

def sqrt_heron(n, err):
    g = heron(n)
    prev = g.next()
    current = g.next()
    while( (prev - current) > err):
        prev = current
        current = g.next()
        print current, prev
    return current

print sqrt_heron(169.0,0.1)

Python 構文は別として、最初の推測から計算された 2 つの推測が必要であり、これら 2 つの推測がどれだけ離れているかを比較することが、あなたを混乱させる可能性があることです。以前の推測が平方根に近いはずの現在の推測よりも平方に近い (したがって大きい) と予想されるため、 while 条件はそうすべきではあり(prev - current) > errません。(current - prev) > err最初の推定値は任意の正の数になる可能性があるため、それから 2 回の反復を計算して、確実currentに 未満になるようにする必要がありprevます。

于 2013-05-18T00:15:15.533 に答える
0

私は同じ問題を扱っていましたが、Python の知識が非常に限られているため、それを解決するためのツールはあまりありませんでした。
あまりエレガントでも高度でもないこのソリューションを思いつきましたが、ヘロンのアルゴリズムを使用して問題を解決します。ここで共有したいだけです:

print("Please enter a positive integer 'x' to find its square root.")
x = int(input("x ="))
g = int(input("What's your best guess: "))
results = [g]
if g * g == x:
    print("Good guess! The square root of", x, "is", g)
else:
    g = (g + (x / g)) / 2
    results.append(g)
    while results[-1] != results[-2]:
        g = (g + (x / g)) / 2
        results.append(g)
    else:
        print(results)
        print("Not quite. The square root of", x, "is", results[-1])
于 2020-06-05T05:01:00.417 に答える
0

これはあなたの要件を満たしていると思います(注:python 2.7.10で書きました):1の推測を想定しておらず、「n」と「エラー」の引数として「num」と「tolerance」を取ります。また、変数「prev」と「current」または while ループを使用しません。これらは要件の一部ですか、または解決策に関する考えですか?

def heron(num, guess, tolerance):
    if guess**2 != num:
        ##print "guess =", guess
        if abs(float(num) - float(guess)**2) > float(tolerance):
            avg_guess = 0.5 * (float(guess) + (float(num) / float(guess)))
            return heron(num, avg_guess, tolerance)
        print "Given your tolerance, this is Heron's best guess:", guess
    else:
        print guess, "is correct!"

推測の進行状況を確認したい場合は、print コマンドのコメントを外してください。

于 2016-04-04T03:22:27.383 に答える