python中的内存化硬币更改(递归解决方案)

python中的内存化硬币更改(递归解决方案),python,recursion,optimization,memoization,Python,Recursion,Optimization,Memoization,我是python的新手,我在练习在线发现的几个问题(这是eulerproject q31)。我想出了两种方法来解决这个问题。 问题是:用一套特定的硬币,例如美元{1,5,10,25},找出你可以兑换一定数量货币的所有方法 这是我的递归解决方案的代码 def count(s, m, n): if (n < 0): return 0; if (m <=0 and n >= 1): return 0 if (n == 0):

我是python的新手,我在练习在线发现的几个问题(这是eulerproject q31)。我想出了两种方法来解决这个问题。 问题是:用一套特定的硬币,例如美元{1,5,10,25},找出你可以兑换一定数量货币的所有方法

这是我的递归解决方案的代码

def count(s, m, n):
    if (n < 0):
        return 0;
    if (m <=0 and n >= 1):
        return 0
    if (n == 0):
        return 1
    return count( s, m - 1, n) + count(s, m, n-s[m-1] ); 
def计数(s、m、n):
如果(n<0):
返回0;
如果(m=1):
返回0
如果(n==0):
返回1
返回计数(s,m-1,n)+计数(s,m,n-s[m-1]);
S是一套硬币{1,5,10,25} m是硬币组的长度(在本例中为4),n是输入量


这是完美的,除了当我尝试给它一个更大的值,比如7000,我在网上查了一下,我的解决方案似乎将包括上一个递归迭代多次包含的子问题(使其达到最大递归限制)。我试图弄清楚如何使用memonization来实现这一点,我可以使用Java,但不知道如何使用python。有谁能给我提供一些指导,告诉我应该如何记忆这个算法,这样它就可以跳过已经检查过的子问题了吗?谢谢

存储您计算的金额

def make_change(coins, n):
    dic_ways = {}

    def helper(index, n):
        if n == 0:
            return 1
        if n < 0:
            return 0
        num_ways = 0
        for i in range(index, len(coins)):
            coin = coins[i]
            if n - coin not in dic_ways:
                num_ways += helper(i + 1, n - coin)
                dic_ways[n-coin] = True
        return num_ways

    return helper(0, n)
def兑换(硬币,n):
dic_ways={}
def辅助程序(索引,n):
如果n==0:
返回1
如果n<0:
返回0
num_ways=0
对于范围内的i(索引,len(硬币)):
硬币
如果n-硬币不以dic_方式:
num_ways+=helper(i+1,n-硬币)
dic_ways[n-coin]=真
返回num_方式
返回帮助程序(0,n)

正如你所看到的,n是数量。当您遇到已计算的金额时,只需跳过它。

记忆可能是一个选项,但这看起来像是动态编程的经典用法
functools
有一个可以使用的备忘录装饰器。@lru\u缓存我已经实现了一个动态解决方案,我试图通过在时间复杂度不是指数的情况下创建递归解决方案来挑战自己。我只是不太了解记忆。试着点击上面的
lru\u缓存
链接。这不是很有用,因为递归调用之间不共享
dic\u方法
字典。您可能应该将它作为函数的参数,这样您就可以根据需要传递它,只需在第一次调用时从头开始生成它。@Blckknght您是对的,我已经移出了要共享的函数。