5
votes

récursivité dans un tableau pour trouver des nombres impairs et pousser vers une nouvelle variable

J'ai essayé de récurer ces tableaux pour trouver des nombres impairs / pairs, puis les pousser vers newArr mais le résultat, pas un tableau, ce résultat est la chaîne avec des nombres le résultat après avoir trouvé le pair / impair nombres.

c'est le code que j'ai écrit,

function odd(nums){
  var result = [];
  if(nums.length === 0) {
    return result;
  } else  if (nums[0] % 2 === 0){
    result.push(nums[0])
    // return odd(nums.slice(1))
  };
  return result + odd(nums.slice(1));
};

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var print = odd(arr);
console.log(print)

si je n'écris pas return result + odd (nums.slice (1)); le résultat rien / undefined ,

quelqu'un peut-il m'aider pour expliquer pourquoi il en résulte une chaîne, pas un tableau que je voulais


0 commentaires

5 Réponses :


5
votes

Vous devez concater des tableaux. + ne fonctionne que pour les chaînes ou pour les nombres.

BTW, après les instructions de bloc {...} , vous n'avez pas besoin d'un point-virgule.

function odd(nums){
    var result = [];
    if (nums.length === 0) {
        return result;
    } 
    if (nums[0] % 2 === 0) {
        result.push(nums[0]);
    }
    return result.concat(odd(nums.slice(1)));
}

var arr = [1, 8, 3, 4, 4, 5, 9, 13, 13, 9, 10];
var print = odd(arr);
console.log(print);


11 commentaires

Vous étiez plus rapide avec 2 secondes :). Quoi qu'il en soit, +1.


si nous voulions vérifier que les nombres sont un palindrome, le si les nombres ne sont pas palindrome que les nombres continueront à s'ajouter jusqu'à ce que nous trouvions que les nombres sont un palindrome, `EX: num = 106, pas palindrome, le num + = 1 maintenant num 107, pas de palindrome à nouveau, puis ajouter à nouveau jusqu'à ce que 111 soit un palindrome`, alors le résultat des nombres est 111, pouvons-nous faire cela en récursivité ?? , j'ai été essayé mais le résultat trop de récurrences @Nina


@ZumDummi, quel devrait être le résultat de la récursivité? pour obtenir un palindrome plus proche ou simplement true / false ?


le résultat doit être le dernier numéro qui est un palindrome, je sais trouver le retour et vrai, mais je veux savoir si nous pourrions contrer les nombres ou non si nous l'utilisons avec des récursions: D, est-ce possible ??


oui, c'est possible en prenant un tableau ou un objet comme résultat et en appelant la fonction jusqu'à ce qu'elle donne un résultat valide.


pouvez-vous me donner l'exemple, si. ça ne vous dérange pas? @NinaScholz


contrôle de la fonction (nombre, nombre = 1) {retourne isPalindrome (nombre)? [nombre, compte]: contrôle (nombre + 1, compte + 1); } alors vous avez besoin d'une autre fonction pour vérifier si le num est un palindrome.


@NinaScholz repl.it/repls/LoudNoisyDictionary vérifier ceci, ne pouvons-nous pas ajouter la variable dans la fonction de paramètre?


@NinaScholz j'ai mis à jour mon code là-bas sur ce site repl.it/repls/LoudNoisyDictionary , et mon code infini boucle


@ZumDummi, comme je l'ai écrit, vous pouvez séparer le chèque et celui-ci uniquement pour un palindrom et le prendre dans le nœud d'une autre fonction qui maintient les appels récursifs et renvoie le résultat ou un autre appel avec des arguments modifiés de la fonction ou du résultat. en fait je n'ai pas le temps, peut-être plus tard.


continuons cette discussion dans le chat .



2
votes

Vous pouvez utiliser la méthode concat .

function odd(nums){
  var result = [];
  if(nums.length === 0) {
    return result;
  } else  if (nums[0] % 2 === 0){
    result.push(nums[0])
    // return odd(nums.slice(1))
  }
  return result.concat(odd(nums.slice(1)));
}

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var print = odd(arr);
console.log(print)


0 commentaires

1
votes

Au lieu du concat a > vous avez besoin à la place de la concaténation de chaîne + que vous utilisez maintenant, mieux utiliser filtre

var odd = [], 
   even = [1,8,3,4,4,5,9,13,13,9,10]
  .filter(function(x) { if (x % 2 === 0) return true; else odd.push(x) } );
console.log(odd,even)


0 commentaires

4
votes

La récursivité est probablement une mauvaise idée dans JS, vous devriez l'utiliser à moins qu'il n'y ait pas de meilleure façon de résoudre un problème. Cela sera plus lent et entraînera éventuellement un débordement, si trop d'appels de fonction récursive sont effectués.

Pour obtenir le résultat dont vous avez besoin, il est préférable d'utiliser array filter . C'est plus clair et plus rapide.

function odd(nums, result = []){
  if (!nums.length) return result; // no need for else, this way clearer
  if (nums[0] % 2 === 0) result.push(nums[0])
  return odd(nums.slice(1), result)
};

const arr = Array.from({length: 100000}, (_,i) => i)
const result = odd(arr)
console.log(`Array length: ${arr.length}`)
console.log(`Result length: ${result.length}`)
console.log(result.slice(0,5))

Quant à la question d'origine, je le ferais de cette façon:

function odd(nums, result = []){
  if (!nums.length) return result; // no need for else, this way clearer
  if (nums[0] % 2 === 0) result.push(nums[0])
  return odd(nums.slice(1), result)
};

var arr = [1,8,3,4,4,5,9,13,13,9,10];
console.log(odd(arr))

!!! Attention, le prochain extrait de code entraînera StackOverflow !!!

Vous pouvez réduire la longueur du tableau à 10000 pour vérifier que cela fonctionnera très bien.

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var odd = arr.filter(n => !(n % 2))
console.log(odd)


6 commentaires

Je m'oppose principalement à l'idée que la récursivité dans JS est généralement une mauvaise idée. S'il est utilisé correctement, il peut être extrêmement utile.


je le sais, je. je veux juste apprendre à utiliser la récursivité: D, merci pour l'info: D


J'ai reformulé la réponse à propos de la récursivité :) @ Lewis, pouvez-vous donner un exemple de quand c'est extrêmement utile?


Construire un moteur de jeu Javascript, filtrer par niveaux de catégorie pour les menus ...


@ZumDummi J'ai mis à jour la réponse, dans les fonctions récursives, vous voudrez peut-être une variable d'accumulateur.


Je suis d'accord sur celui-ci, la récursivité est lente lorsqu'il s'agit de grands ensembles de données. Lorsque le tableau est très long, cela provoque une exception StackOverflowException en raison de nombreux appels récursifs.



1
votes

Une autre approche serait de passer le tableau contenant le résultat en paramètre, car il s'agira d'une référence, vous n'avez rien à renvoyer.

function odd(nums, result)
{
    if(nums.length != 0)
    {
        if (nums[0] % 2 === 0)
        {
            result.push(nums[0]);
        }
        odd(nums.slice(1), result);
    }
}

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var result = [];
odd(arr, result);
console.log(result)


1 commentaires

dans mon école, la règle des examens, on ne peut pas ajouter d'autres paramètres dans la fonction récursivité: D @Cid