我的导师给了我一些问题让我们考虑递归。在其中一个中,我们获得了一个价值(邮资的成本)和一系列可用的邮票面额。练习涉及编写递归函数,该函数返回最小长度的邮票列表,其总数等于邮资的总和。
解决这个问题的正确方法是让一个程序比较每一种可能性并返回一个长度最小的程序吗?如果是这样的话,我不确定如何为它编写程序,更不用说利用递归了,因为我对python和编程都很新。根据教师提供的提示,我想出了类似的东西:
stampList=[1,4,7]
postage=10
def pickStamps(postage):
if postage==0: #base case 1
return ""
if postage<0: #base case 2
return none
else:
x=postage
for i in range(len(stampList)-1):
x=x-stampList[i]
return pickStamps(x)
我试图让python以postage的值开始并且将每个面额减去组合以得到零,但我不确定如何将每种可能性放入列表中。在问题中建议,编写另一个函数可能是明智的,该函数接受一个列表列表的参数并返回该列表中最小长度元素的索引,但我不确定如何实现它。有人可以告诉我如何编写这样的代码或解释解决这个问题的最佳方法吗?谢谢!
答案 0 :(得分:1)
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED );
试驾:
textStyle : {
color: '#fff',
fontName: "InterstateRegular",
fontSize: 16,
bold: false,
},
请注意,解决方案在您的示例中实际上是非唯一的,即7,1,1,1和4,4,1,1都是相同的长度。
让我们假设我们有一个新的价值标记3,我们应该期待看到一个独特的解决方案(7 + 3 == 10有两个邮票)。
def ways(wallet, stamp_values, postage):
amount = sum(wallet)
if amount == postage:
return [wallet]
elif amount > postage:
return []
else:
next_stamp = wallet[-1] if wallet else max(stamp_values)
new_stamps = stamp_values[stamp_values.index(next_stamp):]
gen = (ways(wallet + [c], new_stamps, postage=postage) for c in new_stamps)
return sum(gen, [])
答案 1 :(得分:0)
想象一下,你有一个已经有效的功能:
def pick_stamps(postage):
'''Returns list of stamps needed to cover postage'''
鉴于您有此功能,您可以使用它来实现您的版本:
def my_pick_stamps(postage):
if postage == 0:
return []
else:
stamp = max(stamp for stamp in stamps
if stamp <= postage)
return [stamp] + pick_stamps(postage - stamp)
当然,一旦您实施了您的版本,您就可以使用该版本,并使用pick_stamps
替换您的实施中的my_pick_stamps
。