javascript 有没有一个函数可以计算它们之间一组数字的所有可能的和?

z9smfwbn  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(113)

我已经面临一个问题好几天了,我有一个值,比如N = 0.8和一个数组,比如tab = [0.4, 0.1, 0.4, 0.5]这里我们可以看到索引0和2的值是0. 8,但是我不能用一种干净的方式来编程,我最终得到了太多的for循环(精确地说是3个)。
我试着做了一个简单的算法,创建一个变量value = 0,两个for循环,在第一个循环中添加第一个元素,在第二个循环中添加其他元素,同时检查value + tab[j] <= 0.8,在某些情况下它有效,在其他情况下,它小于0。8。

eh57zj3b

eh57zj3b1#

const isFoud = (array, value1, value2) => {
  let found = false;
  array.every((item) => {
    if (
      JSON.stringify(item) === JSON.stringify(value1) ||
      JSON.stringify(item) === JSON.stringify(value2)
    ) {
      found = true;
      return false;
    } else {
      return true;
    }
  });
  return found;
};

//the function above is to verify if the new combination is found in the combinations array

tab = [0.4, 0.4, 0.4, 0.4];
const N = 0.8;
var combinations = [];
var i = 1;
tab.forEach((element) => {
  for (let j = i; j < tab.length; j++) {
    if (element + tab[j] <= N && !isFoud(combinations, [element, tab[j]], [tab[j], element]))
      combinations.push([element, tab[j]]);
  }
  i++;
});
console.log(combinations);
htzpubme

htzpubme2#

这是一个递归的版本。
当总和为零时,我们有基本情况,返回true;当值列表为空时,返回false;如果列表中的第一个数字太大,我们就丢弃它,然后再循环;然后我们尝试使用第一个数字,从目标值中减去它,再循环剩余的数字;如果不起作用,我们尝试丢弃第一个数字并以相同的目标重复。

const canSum = (t, [n, ...ns]) =>
  t == 0
    ? true
  : n === undefined
    ? false
  : n > t
    ? canSum (t, ns)
  : canSum (t - n, ns) || canSum (t, ns)

console .log (`canSum (0.8, [0.4, 0.1, 0.4, 0.5]) //=> ${canSum (0.8, [0.4, 0.1, 0.4, 0.5])}`)

console .log (' ')
console .log (`Trying 1 - 40 with [2, 3, 5, 7, 11, 13]`)
console .log (`=======================================`)

Array.from ({length: 40}, (_, i) => i + 1) 
  .forEach (n => console .log (`[2, 3, 5, 7, 11, 13] ${canSum (n, [2, 3, 5, 7, 11, 13]) ? '*can*' : '*cannot*'} sum to ${n}`))
.as-console-wrapper {max-height: 100% !important; top: 0}

我们可以编写类似的代码来找到第一个有效的集合:
一个二个一个一个

相关问题