【问题标题】:Tracing recursion stack for the subset sum跟踪子集总和的递归堆栈
【发布时间】:2016-08-10 12:53:04
【问题描述】:

递归如何解决看似复杂的问题似乎很神奇,我正在阅读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

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

【问题讨论】:

    标签: algorithm recursion subset-sum


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 2011-05-25
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多