修改递归子集Sum + Memoize以打印值

时间:2014-03-09 02:42:17

标签: python recursion iteration memoization subset-sum

我正在试图弄清楚如何修改我的代码以解决子集求和问题,以便我可以打印出它最终返回True时找到的值。我当前的实现以递归方式工作并使用memoization,但我无法弄清楚如何更改它以存储并最终返回到达所需总和的路径。

我已经尝试废弃它的递归并改为使用迭代,但我无法弄清楚如何在for循环中布置代码以处理我们不使用下一个值的情况以及何时我们用它。

注意:在此实现中,值只能使用一次,不确定原始“子集和”问题是否强制执行...

def subsetSum(tot, vals, mem={}):
  key = (tot, len(vals))
  if key not in mem:
    if tot == 0:
      mem[key] = True
      return True
    if tot < 0 or len(vals) == 0:
      mem[key] = False
      return False
    return subsetSum(tot, vals[:-1], mem) or 
           subsetSum(tot-vals[-1], vals[:-1], mem)
  else:
    return mem[key]

如何转换此任何帮助或提示将不胜感激。我这样做是为了接受采访。

1 个答案:

答案 0 :(得分:1)

您可以在调用该功能时使用print。尝试使用不同的值调用函数来满足函数中的各种条件。

例如:

print subsetSum(tot, vals, mem)

或者,您可以在函数中的任何位置添加print语句。

例如:

def subsetSum(tot, vals, mem={}):
  key = (tot, len(vals))
  if key not in mem:
    if tot == 0:
      mem[key] = True
      return True
    if tot < 0 or len(vals) == 0:
       print tot, len(vals)   #Added a print statement here
       mem[key] = False
       return False
    return subsetSum(tot, vals[:-1], mem) or 
           subsetSum(tot-vals[-1], vals[:-1], mem)
  else:
    return mem[key]