Maison interface Web js tutoriel JavaScript implémente la sélection de n nombres dont la somme est égale à une valeur fixe à partir d'un tableau_javascript skills

JavaScript implémente la sélection de n nombres dont la somme est égale à une valeur fixe à partir d'un tableau_javascript skills

May 16, 2016 pm 04:37 PM
数组

Les problèmes de la vie réelle peuvent être résumés dans un tel modèle de données :

Sélectionnez plusieurs nombres dans un tableau afin que la somme de ces nombres soit la valeur spécifiée.

La plupart des lecteurs devraient avoir eu l'expérience des achats en ligne. Les achats en ligne ont généralement une fonction pour collecter les commandes. Si le lecteur achète un produit de 70 yuans, mais que l'achat doit dépasser 100 yuans pour bénéficier de la livraison gratuite, le système le fera automatiquement. Je recommande certains produits. Cela coûte près de 100 yuans.

Comment le système détermine-t-il les produits à recommander ? Il s'agit en fait du modèle que nous venons de mentionner. Nous pouvons regrouper les prix des produits les plus vendus dans un tableau, puis utiliser un algorithme pour découvrir quels prix dans le tableau totalisent 30 yuans.

Sans plus attendre, Xiaocai partagera avec vous une version JavaScript de l'implémentation de l'algorithme.

Code de l'algorithme :

function getCombBySum(array,sum,tolerance,targetCount){
var util = {
/*
get combination from array
arr: target array
num: combination item length
return: one array that contain combination arrays
*/
getCombination: function(arr, num) {
var r=[];
(function f(t,a,n)
{
if (n==0)
{
return r.push(t);
}
for (var i=0,l=a.length; i<=l-n; i++)
{
f(t.concat(a[i]), a.slice(i+1), n-1);
}
})([],arr,num);
return r;
},
//take array index to a array
getArrayIndex: function(array) {
var i = 0,
r = [];
for(i = 0;i<array.length;i++){
r.push(i);
}

return r;
}
},logic = {
//sort the array,then get what's we need
init: function(array,sum) {
//clone array
var _array = array.concat(),
r = [],
i = 0;
//sort by asc
_array.sort(function(a,b){
return a - b;
});
//get all number when it's less than or equal sum
for(i = 0;i<_array.length;i++){
if(_array[i]<=sum){
r.push(_array[i]);
}else{
break;
}
}

return r;
},
//important function
core: function(array,sum,arrayIndex,count,r){
var i = 0,
k = 0,
combArray = [],
_sum = 0,
_cca = [],
_cache = [];

if(count == _returnMark){
return;
}
//get current count combination
combArray = util.getCombination(arrayIndex,count);
for(i = 0;i<combArray.length;i++){
_cca = combArray[i];
_sum = 0;
_cache = [];
//calculate the sum from combination
for(k = 0;k<_cca.length;k++){
_sum += array[_cca[k]];
_cache.push(array[_cca[k]]);
}
if(Math.abs(_sum-sum) <= _tolerance){
r.push(_cache);
} 
}

logic.core(array,sum,arrayIndex,count-1,r);
}

},
r = [],
_array = [],
_targetCount = 0,
_tolerance = 0,
_returnMark = 0;

//check data
_targetCount = targetCount || _targetCount;
_tolerance = tolerance || _tolerance;

_array = logic.init(array,sum);
if(_targetCount){
_returnMark = _targetCount-1;
}

logic.core(_array,sum,util.getArrayIndex(_array),(_targetCount || _array.length),r);

return r;
}
Copier après la connexion

Instructions d'appel :

array : tableau de sources de données. Requis.

somme : somme ajoutée. Requis.

tolérance : Tolérance. Si ce paramètre n'est pas spécifié, la somme doit être égale au paramètre sum La spécification de ce paramètre permet au résultat de flotter dans la plage de tolérance. Facultatif.

targetCount : nombre d'opérandes. Si ce paramètre n'est pas spécifié, le résultat inclura toutes les situations possibles. La spécification de ce paramètre peut filtrer l'ajout d'un nombre fixe de nombres. S'il est spécifié comme 3, le résultat inclura uniquement l'ajout de trois nombres. Facultatif.

Valeur de retour : ce qui est renvoyé est un tableau dans une structure de tableau. Les éléments du tableau interne sont les opérandes et les éléments du tableau externe sont tous des résultats possibles.

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Musée de deux points: Guide de localisation de Bungle Wasteland
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Musée de deux points: Guide de localisation de Bungle Wasteland
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment supprimer les éléments en double du tableau PHP à l'aide de la boucle foreach ? Comment supprimer les éléments en double du tableau PHP à l'aide de la boucle foreach ? Apr 27, 2024 am 11:33 AM

Comment supprimer les éléments en double du tableau PHP à l'aide de la boucle foreach ?

Inversion des valeurs clés du tableau PHP : analyse comparative des performances de différentes méthodes Inversion des valeurs clés du tableau PHP : analyse comparative des performances de différentes méthodes May 03, 2024 pm 09:03 PM

Inversion des valeurs clés du tableau PHP : analyse comparative des performances de différentes méthodes

L'art de PHP Array Deep Copy : utiliser différentes méthodes pour obtenir une copie parfaite L'art de PHP Array Deep Copy : utiliser différentes méthodes pour obtenir une copie parfaite May 01, 2024 pm 12:30 PM

L'art de PHP Array Deep Copy : utiliser différentes méthodes pour obtenir une copie parfaite

Pratique du tri multidimensionnel des tableaux PHP : des scénarios simples aux scénarios complexes Pratique du tri multidimensionnel des tableaux PHP : des scénarios simples aux scénarios complexes Apr 29, 2024 pm 09:12 PM

Pratique du tri multidimensionnel des tableaux PHP : des scénarios simples aux scénarios complexes

Application de la fonction de regroupement de tableaux PHP dans le tri des données Application de la fonction de regroupement de tableaux PHP dans le tri des données May 04, 2024 pm 01:03 PM

Application de la fonction de regroupement de tableaux PHP dans le tri des données

Meilleures pratiques pour la copie approfondie des tableaux PHP : découvrez des méthodes efficaces Meilleures pratiques pour la copie approfondie des tableaux PHP : découvrez des méthodes efficaces Apr 30, 2024 pm 03:42 PM

Meilleures pratiques pour la copie approfondie des tableaux PHP : découvrez des méthodes efficaces

Le rôle de la fonction de regroupement de tableaux PHP dans la recherche d'éléments en double Le rôle de la fonction de regroupement de tableaux PHP dans la recherche d'éléments en double May 05, 2024 am 09:21 AM

Le rôle de la fonction de regroupement de tableaux PHP dans la recherche d'éléments en double

Algorithme de fusion et de déduplication de tableaux PHP : solution parallèle Algorithme de fusion et de déduplication de tableaux PHP : solution parallèle Apr 18, 2024 pm 02:30 PM

Algorithme de fusion et de déduplication de tableaux PHP : solution parallèle

See all articles