鍍金池/ 問(wèn)答/人工智能  Java  C++  HTML/ 如何優(yōu)化這個(gè)遞歸算法?

如何優(yōu)化這個(gè)遞歸算法?

原帖 集合的劃分,
我需要把所有的可能都列出來(lái)。。

我根據(jù)上面的算法寫(xiě)的代碼,但會(huì)讓瀏覽器內(nèi)存爆了,請(qǐng)問(wèn)如何優(yōu)化這個(gè)遞歸算法?

大神可以忽略我的代碼,直接寫(xiě)自己的代碼,解決我的需求。。多謝。

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

        [  [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); //調(diào)用下一層遞歸
            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)
            }
        } 
    }
回答
編輯回答
愛(ài)礙唉

感覺(jué)這個(gè)就可以一定程度的優(yōu)化。
Js通過(guò)記憶優(yōu)化遞歸

2017年2月11日 00: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))
2018年8月24日 15:19