Rumah > Artikel > hujung hadapan web > JavaScript melaksanakan pemilihan n nombor yang jumlahnya sama dengan nilai tetap daripada kemahiran array_javascript
Masalah dalam kehidupan sebenar boleh disarikan ke dalam model data sedemikian:
Pilih beberapa nombor daripada tatasusunan supaya jumlah nombor ini ialah nilai yang ditentukan.
Kebanyakan pembaca sepatutnya mempunyai pengalaman membeli-belah dalam talian biasanya mempunyai fungsi untuk mengumpul pesanan Jika pembaca membeli produk 70 yuan, tetapi pembelian mesti melebihi 100 yuan untuk mendapatkan penghantaran percuma, sistem akan secara automatik. mengesyorkan beberapa produk. Ia berharga hampir 100 yuan.
Bagaimanakah sistem menentukan produk yang hendak disyorkan? Ini sebenarnya model yang baru sahaja disebutkan.
Tanpa berlengah lagi, Xiaocai akan berkongsi dengan anda versi JavaScript pelaksanaan algoritma.
Kod algoritma:
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; }
Arahan panggilan:
tatasusunan: tatasusunan sumber data. Diperlukan.
jumlah: jumlah ditambah. Diperlukan.
toleransi: Toleransi. Jika parameter ini tidak dinyatakan, jumlah mesti sama dengan parameter jumlah Menentukan parameter ini membolehkan keputusan terapung dalam julat toleransi. Pilihan.
Bilangan sasaran: Bilangan operan. Jika parameter ini tidak dinyatakan, hasilnya akan merangkumi semua situasi yang mungkin. Menentukan parameter ini boleh menapis penambahan bilangan nombor tetap Jika ia dinyatakan sebagai 3, hasilnya hanya akan merangkumi penambahan tiga nombor. Pilihan.
Nilai pulangan: Apa yang dikembalikan ialah tatasusunan dalam struktur tatasusunan Unsur-unsur dalam tatasusunan ialah operan, dan unsur-unsur dalam tatasusunan luar adalah semua hasil yang mungkin.