1

この再帰呼び出しで何が欠けているのかわかりません...

var power = function(b, e)
{
    if (e===0)
    {
       return 1;
    }
    else
    {
       return b*power(b, e-1);
    }
};

最初のifステートメントは、数値をゼロ乗するためのものです(常に1に等しい)。ただし、これは基本ケースでもあるため、e(指数)が0に達すると、関数が終了し、正しい答えが返されます。

これは、番号1ではなく正しい番号をどのように返しますか?毎回、eは0になりますが、1ではなく正解を返します。申し訳ありませんが、私は初心者ですが、とても混乱しています...

4

4 に答える 4

4

再帰関数があります。「1を返す」と、スタックフレームを逆戻りし、スタックした他のすべてのb変数で1を乗算します。1 * b * b *b...など

1*何でも恒等関数です。1ではなく自分自身を返します。

于 2012-06-20T22:41:16.340 に答える
2

あなたがそうするとしましょうpower(2,4)、それは入り、elseそして戻り2 * power(2, 3)ます。戻る前に、返す式を評価する必要があるため、を評価しpower(2, 3)ます。

これはelse再びに行きreturn 2 * power(2,2)ます。ここでも同じように、式を評価する必要があります。単純に1を返すベースケースに到達するまで、これを続けます。次に、下から2番目のレベルに移動します。これは2*1、次のレベルになるため、次のレベルに移動します。2*2*1それが最上位レベルに到達し、あなたにあなたの答えを与えるまで、以下同様です。

詳細については、このSO(同じ質問)を参照してください。

于 2012-06-20T22:46:53.827 に答える
1

実行例は次のとおりです。

べき=関数(2、2)

2は0とは異なり、2 * function(2、1)を返します。

   -> 1 is different of 0, then return 2*function(2, 0)

           -> 0 equal 0 return 1

   -> return 2*1

2 * 2*1を返します

パワー=4

于 2012-06-20T22:48:43.000 に答える
1

スタックには、1 * b * b * b * b...e回あります。ベースケースがヒットすると、スタックが巻き戻され、正しい答えが得られます。

于 2012-06-20T22:41:49.517 に答える