我正在尝试解决递归练习,并感到非常困惑。 问题如下:
假设我有一个n平方米的公寓, i = [1,2,3 ...,n]是平方米的单位,[p1,p2,p3,...,pn]是对应的每平方米价格(例如,p1是1平方米,而pn是n平方米的价格。
我想找到分割我的公寓的最佳方法,这将给我“最大的收入”。
示例-如果我有4平方米的公寓,并且大小1,2,3,4的价格表分别为[1,5,8,9],则这些是选项集:
因此,我的函数“ profit”应为输入返回数字10: 利润([1,5,8,9],4)
有人要求我使用以下模式解决此问题,其中递归调用必须仅在循环内:
def profit(value, size):
...
for i in range(size):
...
return ...
在很长一段时间后,我设法解决了没有循环条件的问题,但这确实让我感到沮丧,这是多么困难和不直观的递归函数。 我将非常感谢您针对此类问题提供的一般性指导提示,即使您可以向我推荐其他资源,也可能会帮助我更好地学习该主题。有时候我很难跟随。
当然,感谢您在此特定功能方面的帮助...
答案 0 :(得分:1)
使用以下功能解决该问题:
def profit(value,size):
if size <= 0:
return 0
lst1 = []
for i in range(size):
lst1.append(profit(value, size-(i+1))+value[i])
return max(lst1)
答案 1 :(得分:0)
您可以创建一个函数,该函数查找平方大小范围的可能组合。然后,对于总计为四个的每种组合,可以找到最大地板尺寸:
def profit(value, size):
def combinations(d, _size, current = []):
if sum(current) == _size:
yield current
else:
for i in d:
if sum(current+[i]) <= _size:
yield from combinations(d, _size, current+[i])
options = list(combinations(range(1, size+1), size))
prices = dict(zip(range(1, size+1), value))
result = max(options, key=lambda x:sum(prices[i] for i in x))
return sum(prices[i] for i in result)
print(profit([1,5,8,9], 4))
输出:
10
答案 2 :(得分:0)
我不想给您完整的答案,因为这似乎是一项任务。但是,对于递归为什么在这里是最佳的,我将尝试向正确的方向推。我向您的示例添加了一行代码,我认为这将对您有所帮助。在将其添加到代码中之前,我建议您尝试完全绕开此处发生的事情。
def profit(value, size):
for i in range(size):
# Get the profit of the size before this combined with a 1
profit(value, size - 1) + profit(value, 1)
如果您在理解为什么这样做有用时遇到麻烦,请随时发表评论,稍后我会为您提供更深入的解释。
编辑:
实现递归函数时要记住的一个关键概念是基本情况。
在此示例中,您已经知道每种大小的值,因此将其合并到您的解决方案中。
def profit(value, size):
# BASE CASE
if size == 1 :
return value[0]
# Size > 1
for i in range(size):
# Return the maximum value of all given combinations.
return max(value[size], profit(value, size - 1) + profit(value, 1))
现在这是一个几乎完整的解决方案,只剩下一个。
提示:该代码当前无法测试利润(值2)+利润(值2)(在这种情况下恰好是最大利润)