python中的memoization硬币变化(递归解决方案)

时间:2018-04-27 05:04:51

标签: 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):
        return 1
    return count( s, m - 1, n) + count(s, m, n-s[m-1] ); 

S是硬币组{1,5,10,25} m是硬币组的长度(在这种情况下为4),n是输入量

这完全有效,除了当我尝试给它一个像7000这样的更大的值时,我在网上查找并且似乎我的解决方案将包括多次包含在先前的递归迭代中的子问题(使其达到最大值)递归限制)。我试图弄清楚如何使用memoization来实现这一点,我可以使用Java但不知道如何在python中进行操作。任何人都可以提供任何指导,我应该如何记住这个算法,以便它跳过检查已经检查过的子问题?谢谢!

1 个答案:

答案 0 :(得分:0)

存储您计算的金额。

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE

如您所见,n是金额。当您遇到已计算的金额时,您只需跳过它。