Parce que la puissance (base, exposant) n'a pas de valeur de retour à moins que l'exposant soit 0, initialement, la puissance (base, exposant -1) ne devrait-elle pas renvoyer `` non défini '', et donc être non multipliable, au départ? J'ai donc du mal à suivre la logique de ce code. Pourquoi / comment ça marche?

function power(base, exponent) {
  if (exponent == 0)
    return 1;
  else
    return base * power(base, exponent - 1);
}
4
千里ちゃん 5 oct. 2011 à 09:57

4 réponses

Meilleure réponse

Cela pourrait être plus concis:

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

Cependant, une solution itérative est beaucoup plus rapide:

function powerNR(base, exp) {
  var result = 1;
  while(exp--) {
    result *= base;
  }
  return result;
}
7
RobG 5 oct. 2011 à 07:05
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)
    }
}
0
RyanGonzalezUSA 6 janv. 2020 à 20:08

Je pense que la fonction a plus de sens dans l'autre sens, comme ceci:

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

Le retour des instructions if est enchaîné et ne peut pas être résolu tant que l'instruction else n'est pas exécutée.

Exemples

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;

N'oubliez pas c'est le retour des instructions if / else qui est retransmis dans la chaîne à la fonction qui l'a appelée.

Une métaphore légèrement stupide

Disons que vous voulez poser une question à David mais que vous ne voulez pas crier, vous pouvez demander à la personne à côté de vous, qui pourrait demander à la personne à côté de vous, qui pourrait demander à la personne à côté de vous, et ainsi de suite, jusqu'à ce que la question soit demanda David.

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

Ce n'est qu'une fois que la réponse de David est connue que cette information peut remonter la chaîne des personnes qui ont posé la question.

2
Alex Mckay 16 avril 2018 à 11:54

Regardez ce qui se passe si vous essayez de calculer 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)
}

... qu'est-ce que 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)
}

... qu'est-ce que 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)
}

... qu'est-ce que 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);
}

... mettre cela ensemble, dans l'ordre inverse pendant que nous remontons la pile ...

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.
9
Tim 5 oct. 2011 à 06:11
7657249