将递归与循环结合以找到最大值

时间:2018-07-10 16:39:09

标签: python python-3.x loops recursion

我正在尝试解决递归练习,并感到非常困惑。 问题如下:

假设我有一个n平方米的公寓, i = [1,2,3 ...,n]是平方米的单位,[p1,p2,p3,...,pn]是对应的每平方米价格(例如,p1是1平方米,而pn是n平方米的价格。

我想找到分割我的公寓的最佳方法,这将给我“最大的收入”。

示例-如果我有4平方米的公寓,并且大小1,2,3,4的价格表分别为[1,5,8,9],则这些是选项集:

  • 将公寓保留为一个4平方米的单位(值:9)
  • 将4平方米分为1,1,1,1平方米(总价值:4)
  • 将4平方米分为1,1,2平方米(总价值:7)
  • 将4平方米分成2.2平方米(总价值:10)
  • 将4平方米分为1,3平方米(总价值:9)

因此,我的函数“ profit”应为输入返回数字10: 利润([1,5,8,9],4)

有人要求我使用以下模式解决此问题,其中递归调用必须仅在循环内:

def profit(value, size):
    ...
    for i in range(size):
        ...
    return ...

在很长一段时间后,我设法解决了没有循环条件的问题,但这确实让我感到沮丧,这是多么困难和不直观的递归函数。 我将非常感谢您针对此类问题提供的一般性指导提示,即使您可以向我推荐其他资源,也可能会帮助我更好地学习该主题。有时候我很难跟随。

当然,感谢您在此特定功能方面的帮助...

3 个答案:

答案 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)(在这种情况下恰好是最大利润)