5

power(base、exponent)は、指数が0でない限り戻り値を持たないため、最初は、power(base、exponent -1)が'undefined'を返す必要があります。したがって、最初は乗算できませんか?そのため、このコードのロジックを理解するのに問題があります。なぜ/どのように機能しますか?

function power(base, exponent) {
  if (exponent == 0)
    return 1;
  else
    return base * power(base, exponent - 1);
}
4

5 に答える 5

10

あなたが計算しようとすると何が起こるか見てください5^3

power(5, 3)  ... this should give us 125, let's see if it does...

function power(base, exponent) {    // base = 5, exponent = 3
  if (exponent == 0)                // nope, exponent != 0
    return 1;
  else
    return base * power(base, exponent - 1);  // return 5 * power(5, 2)
}

...何power(5, 2)ですか?..。

function power(base, exponent) {    // base = 5, exponent = 2
  if (exponent == 0)                // nope, exponent != 0
    return 1;
  else
    return base * power(base, exponent - 1);  // return 5 * power(5, 1)
}

...何power(5, 1)ですか?..。

function power(base, exponent) {    // base = 5, exponent = 1
  if (exponent == 0)                // nope, exponent != 0
    return 1;
  else
    return base * power(base, exponent - 1);  // return 5 * power(5, 0)
}

...何power(5, 0)ですか?..。

function power(base, exponent) {    // base = 5, exponent = 0
  if (exponent == 0)                // yup, exponent != 0
    return 1;                       // return 1
  else
    return base * power(base, exponent - 1);
}

...それをまとめて、スタックを上に戻るときに逆の順序で...

power(5, 0) = returns 1
power(5, 1) = 5 * power(5, 0) = 5 * 1 =  returns 5
power(5, 2) = 5 * power(5, 1) = 5 * 5 =  returns 25
power(5, 3) = 5 * power(5, 2) = 5 * 25 =  returns 125

... so, power(5, 3) returns 125, as it should.
于 2011-10-05T06:11:14.143 に答える
6

それはもっと簡潔かもしれません:

function power(base, exponent) {
  return exponent == 0? 1 : base * power(base, --exponent);
}

ただし、反復ソリューションは非常に高速です。

function powerNR(base, exp) {
  var result = 1;
  while(exp--) {
    result *= base;
  }
  return result;
}
于 2011-10-05T06:39:15.233 に答える
2

この関数は、次のように、逆の方が理にかなっていると思います。

const power = (base, exponent) => {
  if (exponent !== 0) {
    return base * power(base, exponent - 1);
  } else {
    return 1;
  }
}

ifステートメント戻り値はチェーン化されており、 elseステートメントが実行されるまで解決できません。

4^0 = else;
4^0 = 1

4^1 = if * else;
4^1 = 4 * 1;

4^2 = if * if * else;
4^2 = 4 * 4 * 1;
    = 4 * 4;
    = 16

// Another way of conceptualising it:

4^2 = if(if(else));
    = 4(4(1));
    = 16;

チェーンの上流でそれを呼び出した関数に渡されるのはif/elseステートメントの戻りであることを忘れないでください。

少しばかげた比喩

デビッドに質問したいが、怒鳴りたくないとしましょう。あなたのそばにいる人、あなたのそばにいる人に尋ねることができる人、あなたのそばにいる人に尋ねることができる人など、質問がデビッドに尋ねた。

const askDavidAQuestion = peopleInBetweenYouAndDavid => {

if (peopleInBetweenYouAndDavid !== 0) {

  console.log('I will ask him');

  return askDavidAQuestion(peopleInBetweenYouAndDavid - 1);

} else {

  console.log('David says no');

}
}

askDavidAQuestion(3);

-> I will ask him
   I will ask him
   I will ask him
   David says no

デビッドの答えがわかって初めて、その情報を質問した人々の連鎖に戻すことができます。

于 2018-04-16T11:54:56.467 に答える
0

関数への呼び出しのスタックが作成されます。このプロセスは、終了条件/「基本ケース」(ここでは戻り値)を満たすまで続きます。その時点で、すべての関数が戻ることができ、元の関数呼び出しが答えを返します。別の言い方をすれば、戻り値はスタックからポップアウトされ、スタックが空になるまで次のステップを(逆の順序で)計算するために使用されます。

例を使用して2^2

power(2, 2); 呼び出し:

function power(2, 2) {
    if (2 === 0) {
        return 1;
    } else {
        return 2 * power(2, 1); // Called (waits in line to be solved)
    }
}

これはにつながります:

function power(2, 1) {
    if (1 === 0) {
        return 1;
    } else {
        return 2 * power(2, 0); // Called (waits in line to be solved)
    }
}

これはにつながります:

function power(2, 0) {
    if (0 === 0) {
        return 1; // Returned (previous calls to recursive case can now be solved)
    } else {
        return 2 * power(2, -1);
    }
}

動作する戻り値が得られたので、いわば外側に戻ることができます。

これはにつながります:

function power(2, 1) {
    if (1 === 0) {
        return 1;
    } else {
        return 2 * 1; // Returned
    }
}

これはにつながります:

function power(2, 2) {
    if (2 === 0) {
        return 1;
    } else {
        return 2 * 2; // Returned
    }
}

これは最終的に4を返します。これは2^2です。

于 2021-04-21T22:52:07.343 に答える
-1
function pow(base, exponent) {
    if (exponent === 0) return 1;
    if (exponent > 0) {
        return base * pow(base, exponent - 1)
    } else {
        // handle negative exponent
        return 1 / base * pow(base, exponent + 1)
    }
}
于 2020-01-06T20:08:27.160 に答える