首页 > 解决方案 > 在这种情况下,我如何实现功能循环语句而不是 for 循环?

问题描述

如何使用函数循环语句(map、forEach、reduce)而不是 for 循环来检查数组中任何两个元素的总和是否存在于数组中。

例如这样的数组

[1, 2, 9, 4, 3] // would return true as 1 + 2 = 3
[2,7,12,6,8,20]  // true as 2 + 6 = 8 which is enough to make it true
[1, 2, 4, 9] //would return false

我可以通过 for 循环来做到这一点:

const checkSumExist = arr => {
  for(let i = 0; i < arr.length; i++) {
    for(let j = i + 1; j < arr.length; j++) {
      if(arr.includes(arr[i] + arr[j])) return true;   
    }
  }

  return false; 
}

那么在这种情况下有没有使用函数循环语句而不是嵌套for循环的解决方案???

标签: javascriptfor-loopfunctional-programming

解决方案


一个简化的实现——</p>

const main = (xs = []) =>
  xs .some ((n, i) =>
    xs .some ((m, j) =>
      i < j && xs .includes (n + m)
    )
  )
  
console.log
  ( main ([ 1, 2, 4, 9, 4, 3 ])   // true
  , main ([ 2, 7, 12, 6, 8, 20 ]) // true
  , main ([ 1, 2, 4, 9 ])         // false
  )

这种优化使用将Set 速度提高到O(1)-</p>

const main = (xs = [], s = new Set (xs)) =>
  xs .some ((n, i) =>
    xs .some ((m, j) =>
      i < j && s .has (n + m)
    )
  )

console.log
  ( main ([ 1, 2, 4, 9, 4, 3 ])   // true
  , main ([ 2, 7, 12, 6, 8, 20 ]) // true
  , main ([ 1, 2, 4, 9 ])         // false
  )

请记住仅在必要时进行优化


推荐阅读