【问题标题】:How to gain data from recursive function?如何从递归函数中获取数据?
【发布时间】:2016-08-17 21:00:34
【问题描述】:

我创建了一个递归函数,它返回您可以在市场上销售苹果的最佳价格。由于在现实世界中解释这个问题要简单得多,所以我将在买家和苹果上解释它。

共有三个买家。每个买家愿意为不同的苹果支付不同的价格。

必须有3*n 苹果,因为您必须向所有(三个)买家出售相同数量的苹果。

该函数找到最好的销售。

例如:apples = [[1,50,1], [1,50,1], [1,1,50]] 表示有三个买家和三个苹果。

第一个苹果 (apples[0]) 可以以 1 美元的价格卖给第一个买家 (apples[0][0]),以 50 美元的价格卖给第二个买家,以 1 美元的价格卖给第三个买家。

(函数返回101是正确的,你不能分配那三个赚更多钱的苹果)

这个功能很好用,但它计算结果(你赚了多少钱)。我想知道我必须把哪个苹果卖给哪个买家才能赚到最多的钱。它在某处,但我不知道如何从函数中获取它,因为它是递归的,直到递归不在最后一级,你不知道你必须计算哪些结果。

apples = [[1,50,1], [1,50,1], [1,1,50]]

def sell_apples(buyer1, buyer2, buyer3):
    global results
    if (buyer1,buyer2,buyer3) in results.keys():
         return results[(buyer1,buyer2,buyer3)]

        n = sum([buyer1, buyer2, buyer3])
        if buyer1 == buyer2 == buyer3 == 0 or n == 0:
            return 0
        os = []
        for i in range(3):
            buyers = [buyer1, buyer2, buyer3]
            if buyers[i] > 0:
                buyers[i] -= 1
                os.append(sell_apples(*buyers) + apples[n - 1][i]) # here are possible parts of results
        m = max(os)
        results[(buyer1,buyer2,buyer3)]=m
        return m


print sell_apples(1,1,1)

返回 101,这是正确的。但我想得到这样的结果:[(0,1),(1,0),(2,2)],这意味着当您将第一个苹果卖给第二个买家、将第二个苹果卖给第一个买家、将第三个苹果卖给第三个买家时,您会得到最好的结果。

可以从apples[n-1][i] 以某种方式获得,但这里有所有选项,不仅仅是我想要的。

【问题讨论】:

  • 你能解释一下你需要什么吗?请简而言之..我不明白
  • 我想知道最佳组合(哪些苹果必须卖给哪些买家)。现在,该函数返回可能的最优价格。
  • 例如 apples = [[1,50,1], [1,50,1], [1,80,50]] >> 应该返回 110 吗? :S
  • 不,应该是 101。因为这是您可以获得的最大值。您将第一个苹果卖给第二个买家 [0][1],第二个苹果卖给第一个买家 [1][0],第三个苹果卖给第三个买家 [2][2]。这是您可以从中获得的最畅销产品。
  • 由于你必须向每个买家出售相同数量的苹果,我将第二个苹果卖给第三个买家(80 美元),你必须以 1 美元的价格再出售一个苹果你别无选择。

标签: python algorithm recursion dynamic-programming


【解决方案1】:

可能递归不是解决这个问题的最佳方法,因为如果重新计算中间结果,看起来会有很多。您已经通过缓存这些结果缓解了这个问题。相反,您可以尝试自下而上地构建问题,首先计算较小问题的最佳结果并将它们保存在表格中。由于您将结果保存在表格中,因此跟踪最终解决方案也将更容易,而不仅仅是分数。

有趣的是,这种保留中间结果的自下而上的方法称为“动态编程”,您在标签中提到了它,但不要在您的程序中使用。动态规划算法有一些很好的例子,例如用于背包问题或维特比算法以及(作为一个非常基本的示例)计算斐波那契数。

您的问题的快速解决方法是在您每次从函数返回时跟踪买家配置。

【讨论】:

  • 用于动态编程目的。我用动态编程方法编辑了代码,这可能将重新计算的数量减少到零。我在考虑自下而上的方法,但想不出什么适合动态编程。
  • 我将函数调用的每个结果保存到名为 results 的字典中,并尝试先在字典中找到它。
  • 我正在尝试,但我无法弄清楚自下而上的方法。当你有 n*3 个苹果时,有很多组合。我会很感激任何提示。
  • 非常感谢Hans,所以这可以算是动态规划吗?是自下而上吗?根据我的发现,我认为是的。
  • 不幸的是,这返回与输入相同:sell_apples(2,2,2) 有 6 个苹果返回结果和 (2,2,2)(2 是苹果的数量买家)。
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 2012-10-12
相关资源
最近更新 更多