0
votes

calculer le résultat d'une variable à l'intérieur d'une fonction récursive

J'ai écrit l'algorithme d'escalier d'impression. Une fonction qui compte n em> imprime les niveaux d'escalier n em>.

p>

    var i = 1;
    function printStaircase(n) {
      //Base case
      if (n < 1) return n;
      //Recursive case
      var line = '';
      line += ' '.repeat(n - 1);
      line += '*'.repeat(i);
      console.log(line);
      i++;
      return printStaircase(n - 1);
    }
    
    printStaircase(10);


6 commentaires

Est-il nécessaire d'accomplir la sortie à l'aide d'une fonction récursive uniquement?


Oui, je ne veux pas y parvenir itératif.


Qu'en est-il de i ? Si vous appelez printstaircase pour la deuxième fois, cela pourrait commencer par être 12 ?


Je me demande simplement s'il est possible de dériver la valeur du i à partir de n . Est-il possible?


Vous pouvez commencer à appeler la méthode comme celle-ci - PrintStaircase (10,1); et transmettre la valeur de i en incrémentant dans l'appel suivant.


Oui, vous devez garder une trace de la valeur initiale de n comme i devrait être initaln - n ou quelque chose comme ça.


4 Réponses :


1
votes

Fermeture à la rescousse:

p>

/** 
  * @return stair case n high
  */
function staircase(n) {
  function helper (cur, str) {
    if (cur < 1) return str;
    return helper(
      cur - 1,
      `${str}${' '.repeat(cur)}${'*'.repeat(n-cur+1)}\n`);
  }
  return helper(n, '');
}

/**
  * prints a staircase n-1 hight
  * @return 0 (don't know why)
  */
function printStaircase(n) {
  console.log(staircase(n));
  return 0;
}

printStaircase(10);
printStaircase(3);


2 commentaires

L'extrait ne semble pas émettre le résultat correct


@Johnsnow corrigé maintenant.



1
votes

Je pense que quelque chose comme ça fonctionnerait xxx

espère que cela aide!


2 commentaires

Oui, merci. C'est ce que je suis également venu avec aussi


@Johnsnow Vous pouvez utiliser un argument par défaut Fonction printStaircase (n, i = 1) {...} donc lorsque vous appelez printstaircase (10) valeur par défaut de 1 sera attribué à i



1
votes

n code> et i code> sont liés dans ce i code> est simplement la valeur intérieure de n code> moins la valeur actuelle de n code> +1 code>, nous pouvons donc capturer cela assez bien avec quelque chose comme:

p>

function printStaircase(n) {
  staircaseInternal(n);

  function staircaseInternal(curr) {
    //Base case
    if (curr < 1) return;
    //Recursive case
    var line = ' '.repeat(curr - 1);
    line += '*'.repeat((n - curr) + 1);
    console.log(line);
    staircaseInternal(curr - 1);
  }
}

printStaircase(10);


1 commentaires

Nice, donc la réponse, je suppose que le seul moyen de le faire est via une fermeture ou un deuxième paramètre à la fonction. J'essaie juste de voir comment préserver la valeur initiale de N, merci cela aide.



2
votes

la récursion est super amusant -

p>

const chars = (c = "") => (n = 0) =>
  n === 0
    ? ""
    : c + chars (c) (n - 1)

const spaces =
  chars (" ")

const stars = 
  chars ("*")

const newline =
  "\n"

const stairs = (n, m = n - 1) =>
  m <= 0
    ? ""
    : spaces (m)
      + stars (n - m)
      + newline
      + stairs (n, m - 1)
      
console .log (stairs (10))

console .log (stairs (4))


0 commentaires