3

はい、これは宿題です。しかし、私は答えを持っています(うまくいくまでそれで遊んだ)私の質問は、「どのように」先生に何度も説明してもらいました(オンラインクラス)ですが、ここの誰かがもっと上手であることを願って、私はそれを理解していません私が考えるように物事を説明します。

割り当ては次のとおりです。

再帰的に自分自身を呼び出して同じ問題のより小さなバージョンを解き、その結果を で乗算して最初の問題を解くことによってrecurPower(base, exp)計算する関数を作成します。base**expbase

この関数は 2 つの値を取る必要がbaseあります。浮動小数点数または整数を指定できます。exp整数≥0になります。1 つの数値を返す必要があります。コードは再帰的でなければなりません**。演算子またはループ構造の使用は許可されていません。

さて、試行錯誤を数回試みた後(これは、物事を大幅に変更するのに数時間かかることを意味します)、正しいコードを思いつき、正しい答えを解決しましたが、方法がわかりません。

コードは次のとおりです。

def recurPower(base, exp):
'''
base: int or float.
exp: int >= 0

returns: int or float, base^exp
'''

if exp <= 0:
    return 1


return base * recurPower(base, exp - 1)

最初のものは、exp = 0 の場合、戻り値が 1 になる部分です。なぜ何かが 1 で返されるのか理解できません。 ?

4

2 に答える 2

5
pow(2, 3)
= 2 * pow(2, 2)
= 2 * (2 * pow(2, 1))
= 2 * (2 * (2 * (pow 2, 0)))
= 2 * (2 * (2 * 1))) ; base case: n=0 -> return 1
= 2 * (2 * 2)
= 2 * 4
= 8

すべての再帰では、基本ケース、つまり再帰が停止する条件が必要です。そうでない場合、再帰は決して終了しません。乗算では、基本ケースは 1 を返す可能性があります。1 による乗算はニュートラルであるためです。つまり、前の計算には影響しません。

基本ケース以外に、x=0 のときに基本ケースに到達するまで、n^x = n * n^(x-1) という「より小さな」ものに関して何かを表現する一般的なケースがあります。

于 2013-10-31T20:19:03.267 に答える
3

最初の問題は、なぜexp <= 01 を返すのかということです。

定義により、指数として 0 を持つものはすべて 1 です。したがって、

1^0 => 1
2^0 => 1
...

2番目の部分に関しては、これは作業中の再帰です。私recurPower(2, 6)が呼び出すと、次のような一連の呼び出しが行われます

recurPower(2, 6) =>
2 * recurPower(2, 5) =>
2 * 2 * recurPower(2, 4) =>
...
2 * 2 * 2 * 2 * 2 * 2 * 1

これが答えです。

したがって、英語では、2 ^ 6 は 2 * 2 ^ 5 とまったく同じです。この規則を使用して、より単純な指数に分解します。

于 2013-10-31T20:16:48.760 に答える