1. ホーム
  2. python

[解決済み] Pythonで再帰的平方根を作るにはどうしたらいいですか?

2022-02-19 09:15:38

質問

このようなコードがあります。

def root(x,n):    
    if n==0:
        return x
    else:
        return 0.5**(x/root(x,n-1)+root(x,n-1))

が、です。

>>>root(4,2)
>>>2.05

なぜ? 他の平方根ではうまくいかないし......。

解決方法は?

を実装しようとしているようですね。 分割差分 しかし、なぜここで累乗演算子(**)を使っているのかはよくわかりません。

再帰的平方根の基本戦略は、平方根を推測し、推測の正確さをチェックし、古い推測が十分に正確でなければ新しい推測を作成し、推測が真の根に十分に近づいて戻るまで再帰的にこれを続けるというものです。

結果の精度(と再帰の深さ)を制御するために、推測と実際の平方根を照合できるようにする必要があります。これを行うには、平方根を二乗して、平方根を求める数値との差を非常に小さくします。

def goodEnough(guess, x):
    return abs((x - (guess * guess))) <= .01 #change this value to make the function more or less accurate

実際に平方根を求めるには、より良い推測を導き出す方法が必要で、これがアルゴリズムの出番となる。ここでは ニュートンの方法 というのも、かなりシンプルだからです。

def newGuess(guess, x):
    return (guess + guess/x)/2

これで、全部まとめることができます。

def root(guess, x):
    if goodEnough(guess, x):
        return guess
    else:
        return root(newGuess(guess, x), x)

そして、もう一歩踏み込めば、guessパラメータを排除することができます。

def sqrt(x):
    return root(x/2, x) #x/2 is usually somewhat close to the square root of a number