如何优化这个递归算法?

发布于 2022-09-06 04:35:30 字数 1793 浏览 22 评论 0

原帖 集合的划分
我需要把所有的可能都列出来。。

我根据上面的算法写的代码,但会让浏览器内存爆了,请问如何优化这个递归算法?

大神可以忽略我的代码,直接写自己的代码,解决我的需求。。多谢。

    calc(3,2) //三个球放入2个盒子中
    /* [

        [  [1],[2,3] ],
        
        [  [2],[1,3] ],

        [  [3],[1,2] ]

    ] */
    function calc(n, k) {
        if ((n < k) || (k == 0)) {
            return  { num: 0 };
        } else if (k == 1) {
            var arr = [];
            for (var i = 0; i < n; i++) {
                arr.push(i + 1)
            };
            return {
                num: 1,
                cont: [
                    [arr]
                ] // [   [[  1 ]]  ]
            };
        } else if (k == n) {
            var arr = [];
            for (var j = 0; j < k; j++) {
                arr.push([j + 1])
            }
            return {
                num: 1,
                cont: [arr] // [   [[1],[2],[3]]  ]
            };
        } else {
            var onePart = calc(n - 1, k - 1)

            var arr = onePart.cont.map(function(item) {
                var Item = JSON.parse(JSON.stringify(item));
                Item.push([n])
                return Item;
            })
            var twoPart = calc(n - 1, k); //调用下一层递归
            var brr = []
            twoPart.cont.forEach(function(item) {
                item.forEach(function(ch, index) {
                    var Item = JSON.parse(JSON.stringify(item));
                    Item[index].push(n);
                    brr.push(Item)
                })
            })
            var total = onePart.num + k * twoPart.num
            return {
                num: total,
                cont: arr.concat(brr)
            }
        } 
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仙女 2022-09-13 04:35:30

感觉这个就可以一定程度的优化。
Js通过记忆优化递归

情感失落者 2022-09-13 04:35:30
function group(total, size) {
  var groupList = []
  var arr = []
  for (let i = 0; i < total; i++) {
    arr.push(i + 1)
  }

  (function (arr, size, group) {
    var arrLen = arr.length
    if (size > arrLen) return
    if (size == arrLen) {
      groupList.push([].concat(group, arr))
    } else {
      for (var i = 0; i < arrLen; i++) {
        var newGroup = [].concat(group)
        newGroup.push(arr[i])
        if (size == 1) {
          groupList.push(newGroup)
        } else {
          var newArr = [].concat(arr)
          newArr.splice(0, i + 1)
          arguments.callee(newArr, size - 1, newGroup)
        }
      }
    }
  })(arr, size, []);

  return groupList;
}
console.log(group(3, 2))
console.log(group(4, 2))
console.log(group(4, 3))
console.log(group(5, 2))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文