Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 找到4个百分比之间的所有可能性_Javascript_Arrays_Algorithm_Performance - Fatal编程技术网

Javascript 找到4个百分比之间的所有可能性

Javascript 找到4个百分比之间的所有可能性,javascript,arrays,algorithm,performance,Javascript,Arrays,Algorithm,Performance,我想找到一种方法,将四个百分比之间的所有可能性合并成一个数组 所需结果: possibilities = [[100,0,0,0],[99,1,0,0],[99,0,1,0],...,[0,0,1,99],[0,0,0,100]] 我正在使用这个函数,但它的速度非常慢,似乎并没有产生所有的可能性 combinePossibilities : function(a, min, max) { var deferred = $q.defer(); function toObject(

我想找到一种方法,将四个百分比之间的所有可能性合并成一个数组

所需结果:

possibilities = [[100,0,0,0],[99,1,0,0],[99,0,1,0],...,[0,0,1,99],[0,0,0,100]]
我正在使用这个函数,但它的速度非常慢,似乎并没有产生所有的可能性

combinePossibilities : function(a, min, max) {
    var deferred = $q.defer();
    function toObject(arr) {
        var rv = {};
        for (var i = 0; i < arr.length; ++i){
            rv['fund'+i] = arr[i];
        }
        return rv;
     }
     var fn = function(n, src, got, all) {
       if (n === 0) {
           if (got.length > 0) {
                var total = 0;
                angular.forEach(got, function(value){
                    total += value; //GET TOTAL OF THE COMBINATION
                });
                if(total === 100){
                    all.push(toObject(got));
                }
            }
            return;
         }
         for (var j = 0; j < src.length; j++) {
             fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);
         }
         return;
     };
     var all = [];
     for (var i = min; i <= max; i++) {
        console.log(a);
        fn(i, a, [], all);
     }
     deferred.resolve(all);
     return deferred.promise;
}
组合可能性:函数(a、最小值、最大值){
var deferred=$q.deferred();
函数对象(arr){
var rv={};
对于(变量i=0;i0){
var合计=0;
角度。forEach(got,函数(值){
total+=value;//获取组合的总计
});
如果(总数===100){
全部。推(toObject(got));
}
}
返回;
}
对于(var j=0;j对于(var i=min;i这个建议是一个函数递归函数,它取和和和长度。它返回一个数组,数组中包含从和到零的组合值

function combine(sum, length, part) {
    var result = [],
        i = sum;

    part = part || [];
    if (length === 1) {
        return [part.concat(sum)];
    }
    if (length === 0) {
        return [part];
    }
    do {
        result = result.concat(combine(sum - i, length - 1, part.concat(i)));
    } while (i--);
    return result;
}
工作原理:

length: 21
[
    [5, 0, 0],
    [4, 1, 0],
    [4, 0, 1],
    [3, 2, 0],
    [3, 1, 1],
    [3, 0, 2],
    [2, 3, 0],
    [2, 2, 1],
    [2, 1, 2],
    [2, 0, 3],
    [1, 4, 0],
    [1, 3, 1],
    [1, 2, 2],
    [1, 1, 3],
    [1, 0, 4],
    [0, 5, 0],
    [0, 4, 1],
    [0, 3, 2],
    [0, 2, 3],
    [0, 1, 4],
    [0, 0, 5]
]
它以给定的
sum
length
和一个空的
结果
集开始,以及一个值为
sum
的迭代器变量
i

如果未给出
部分
,则分配一个空数组

下面是对(剩余的)
长度的一些检查以及它们的特殊处理(如果是)

  • 1
    :这是最后一次迭代,只剩下
    sum
    。然后返回数组中由
    sum
    连接的部分结果
    part

  • 0
    :不再迭代,然后返回数组中的部分结果
    part

如果
长度
既不是
1
也不是
0
,则对
进行迭代,使其为零

combine
的调用将减少的
sum
、减少的
length
和部分结果
part
的值取为
i

调用
combine()
的结果连接到
结果集

组合(5,3)
的示例:

length: 21
[
    [5, 0, 0],
    [4, 1, 0],
    [4, 0, 1],
    [3, 2, 0],
    [3, 1, 1],
    [3, 0, 2],
    [2, 3, 0],
    [2, 2, 1],
    [2, 1, 2],
    [2, 0, 3],
    [1, 4, 0],
    [1, 3, 1],
    [1, 2, 2],
    [1, 1, 3],
    [1, 0, 4],
    [0, 5, 0],
    [0, 4, 1],
    [0, 3, 2],
    [0, 2, 3],
    [0, 1, 4],
    [0, 0, 5]
]
有两个示例的工作代码:

length: 21
[
    [5, 0, 0],
    [4, 1, 0],
    [4, 0, 1],
    [3, 2, 0],
    [3, 1, 1],
    [3, 0, 2],
    [2, 3, 0],
    [2, 2, 1],
    [2, 1, 2],
    [2, 0, 3],
    [1, 4, 0],
    [1, 3, 1],
    [1, 2, 2],
    [1, 1, 3],
    [1, 0, 4],
    [0, 5, 0],
    [0, 4, 1],
    [0, 3, 2],
    [0, 2, 3],
    [0, 1, 4],
    [0, 0, 5]
]
  • 联合收割机(5,3)
  • 联合收割机(10,4)
函数组合(总和、长度、部分){
var结果=[],
i=总和;
零件=零件| |[];
如果(长度==1){
收益[部分收益(总和)];
}
如果(长度==0){
返回[部分];
}
做{
result=result.concat(合并(总和-i,长度-1,部分-concat(i));
}而(我--),;
返回结果;
}
函数打印(数组){
document.write('length:'+array.length+'\n'+JSON.stringify(array,0,4)+'');
}
打印(合并(5,3));

打印(组合(10,4));
你所说的所有可能性是什么意思?比如
[0,0,0,0]
[0,0,0,100]
[0,0,1,0]
最后到
[100,100,100]
?更清楚地定义你的问题。什么是输入,什么是预期的输出?@MattBurland,我想要一个数组,所有可能值都等于100。结果=[[100,0,0,0],[99,1,0,0],…,[95,2,1,2],…,[25,25,25,25],[0,0,0100]。希望我足够清楚。var anArray={ofArray{“所有可能性”:100}好了,所有可能性都等于100的数组为什么有这么多数组?你想要4个整数的所有排列,总和为100?这正是我需要的。非常感谢@NinaScholz!176850个可能性,太多了。