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
5 Réponses :
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);
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 .
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)
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)
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))
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)
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.
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)
dans mon école, la règle des examens, on ne peut pas ajouter d'autres paramètres dans la fonction récursivité: D @Cid