Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从递归函数中获取数据?_Python_Algorithm_Recursion_Dynamic Programming - Fatal编程技术网

Python 如何从递归函数中获取数据?

Python 如何从递归函数中获取数据?,python,algorithm,recursion,dynamic-programming,Python,Algorithm,Recursion,Dynamic Programming,我创建了一个递归函数,它返回市场上苹果的最佳价格。因为在现实世界中解释这个问题要简单得多,所以我将在买家和苹果上解释它 有三位买家。每个买家都愿意为不同的苹果支付不同的价格 必须有3*n苹果,因为你必须向所有(三)个买家出售相同数量的苹果 该函数查找可能的最佳销售 例如:apples=[[1,50,1],[1,50,1],[1,1,50]]表示有三个买家和三个苹果 第一个苹果(apples[0])可以以1美元的价格卖给第一个买家(apples[0][0]),第二个买家50美元,第三个买家1美元

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

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

必须有
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)]
这意味着当你把第一个苹果卖给第二个买家,把第二个苹果卖给第一个买家,把第三个苹果卖给第三个买家时,你会得到最好的结果


它可以通过某种方式从苹果[n-1][i]中获得,但这里有所有选项,而不仅仅是我想要的选项。

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

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


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

您能解释一下您需要什么吗?简言之,请。。我不明白,我想知道最好的组合(哪些苹果必须卖给哪些买家)。现在,函数返回可能的最佳价格。例如,Apple=[[1,50,1],[1,50,1],[1,80,50]>>应该返回110?:斯诺,应该是101。因为这是你能得到的最大值。您将第一个苹果卖给第二个买家[0][1],第二个苹果卖给第一个买家[1][0],第三个苹果卖给第三个买家[2][2]。这是你能从中得到的最好的销售。因为你必须向每个买家出售相同数量的苹果,我认为你已经将第二个苹果卖给了第三个买家(80美元),你必须以1美元的价格出售另一个苹果,因为你没有其他选择。这是出于动态编程的目的。我已经用动态规划方法编辑了代码,它可能会将重新计算的数量减少到零。我在考虑自底向上的方法,但无法找出任何适合动态规划的方法。我正在将函数调用的每个结果保存到名为results的字典中,并尝试首先在字典中找到它。我正在尝试,但我无法找出自底向上的方法。当你有n*3个苹果时,有很多组合。如果有任何提示,我将不胜感激。非常感谢Hans,那么这可以被视为动态规划吗?是自下而上的吗?从我发现的情况来看,我认为是的。不幸的是,这返回的结果与输入相同:sell_apples(2,2,2),6个apples返回结果和(2,2,2)(2是买家的剩余苹果数)。