为子集和跟踪递归堆栈



关于递归如何解决看似复杂的问题,这一切似乎都很神奇,我正在阅读这篇文章,它很好地解释了这个算法。下面是我的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

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

第一级sSym(1,3) || sSum(1,1)
那么sSym(1,3)变成sSym(, 3) || sSum(, 2) => False || False
and sSum(1,1)变成sSym(, 1) || sSum(, 0) => False || true
您可以添加
console.log('sSym(' + allButLast(arr) + ', '+ sum +') || sSum('+ allButLast(arr) + ', '+ (sum - arr.slice(-1)) +')')
这将帮助你调试

最新更新