【问题标题】:unexpected behaviour in this program in python这个程序在 python 中的意外行为
【发布时间】:2013-11-13 19:16:06
【问题描述】:

我有这段代码可以根据给定面额列表的总和计算最小硬币数量。 例如:minimum change for 69 with denomiations [25,10,5,1] : [25, 25, 10, 5, 1, 1, 1, 1]

def get_min_coin_configuration(sum=None, coins=None, cache={}):
    #if cache == None:  # this is quite crucial if its in the definition its presistent ...
    #    cache = {}
    if sum in cache:
        return cache[sum]
    elif sum in coins:  # if sum in coins, nothing to do but return.
        cache[sum] = [sum]
        return cache[sum]
    elif min(coins) > sum:  # if the largest coin is greater then the sum, there's nothing we can do.
        #cache[sum] = []
        #return cache[sum]
        return []
    else:  # check for each coin, keep track of the minimun configuration, then return it.
        min_length = 0
        min_configuration = []
        for coin in coins:
            results = get_min_coin_configuration(sum - coin, coins, cache)
            if results != []:
                if min_length == 0 or (1 + len(results)) < len(min_configuration):
                    #print "min config", min_configuration
                    min_configuration = [coin] + results
                    #print "min config", min_configuration
                    min_length = len(min_configuration)
                    cache[sum] = min_configuration
        return cache[sum]
if __name__ == "__main__":
    print "minimum change for 69 with denomiations [25,10,5,1] by recursive : ",get_min_coin_configuration(69,[25,10,5,1])
    print "*"*45
    print "minimum change for 7 with denomiations [4,3,1] by recursive : ",get_min_coin_configuration(7,[4,3,1])

当我注释掉 main 中的任何一个打印语句时,该程序似乎运行良好。 当我有两个函数调用时,它打印错误。注释掉 main 中的任一打印语句,您会看到它正确打印了最小硬币。

minimum change for 69 with denomiations [25,10,5,1] by recursive :  [25, 25, 10, 5, 1, 1, 1, 1]
*********************************************
minimum change for 7 with denomiations [4,3,1] by recursive :  [5, 1, 1]

【问题讨论】:

    标签: python function output


    【解决方案1】:
    if __name__ == "__main__":
        cache_denom_set1 = {}
        cache_denom_set2 = {}
        print "minimum change for 69 with denomiations [25,10,5,1] by recursive : ",get_min_coin_configuration(69,[25,10,5,1],cache_denom_set1)
        print "*"*45
        print "minimum change for 7 with denomiations [4,3,1] by recursive : ",get_min_coin_configuration(7,[4,3,1],cache_denom_set2)
    

    为每组面额传入一个单独的缓存

    问题是您的缓存已经知道如何将 7 更改为 5,1,1,所以它只是返回...缓存不知道 5 不再在面额集中...

    字典像列表一样是可变的……这应该说明问题

    def dict_fn(cache={}):
        cache[len(cache.keys())] = 1
        print cache
    
    dict_fn()
    dict_fn()
    

    【讨论】:

    • 但是它们是单独的调用,每个都应该有自己的函数对象,并用空缓存初始化..?
    • 不...字典是可变的,您指向的是同一个字典...(在函数顶部打印缓存)...见编辑
    • 这意味着所有的函数对象共享同一个字典?这意味着对它的引用必须存在于某个命名空间中,那是哪个命名空间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2017-03-05
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多