跟踪子集和

时间:2016-08-10 12:53:05

标签: algorithm recursion subset-sum

关于递归如何解决看似复杂的问题,这一切看起来都很神奇,我正在阅读this论文,它精美地解释了这个算法。这是我在javascript中的代码:

function allButLast(arr) {
  return arr.slice(0, arr.length - 1);
}

function sSum(arr, sum) {
  //console.log(arr + ':' + sum);
  if (sum === 0) return true;
  if (sum < 0 || arr.length === 0) return false;

  return sSum(allButLast(arr), sum) || sSum(allButLast(arr), sum - arr.slice(-1));
}

/*
sSum([1, 2], 3)
sSum([1], 3) || sSum([1, 2], 1)
sSum([], 3) || sSum([], 2) || sSum([1, 2], 1)
false || sSum([], 2) || sSum([1, 2], 1)
false || false || sSum([1, 2], 1)
false || false || sSum([1], 1) || sSum([1], 1)
false || false || sSum([], 1) || sSum([], 0) || sSum([1], 1)
false || false || false || true || sSum([1], 1) // evaluation stops here
*/
//console.log(sSum([1, 2], 3));  // true

我想理解和调试我在评论中记录的函数调用,我想知道这是如何执行调用以及我是否正确跟踪它?

1 个答案:

答案 0 :(得分:1)

第一级sSym(1,3)|| sSum(1,1)
然后sSym(1,3)变成sSym(,3)|| sSum(,2)=&gt;假||假的 和sSum(1,1)成为sSym(,1)|| sSum(,0)=&gt;假||真的 您可以添加
console.log('sSym(' + allButLast(arr) + ', '+ sum +') || sSum('+ allButLast(arr) + ', '+ (sum - arr.slice(-1)) +')')
在调用sSum之前,这将有助于你进行调试