为什么这个递归回溯函数在python中计算最小硬币数量时比非递归函数慢?

为什么这个递归回溯函数在python中计算最小硬币数量时比非递归函数慢?,python,function,recursion,backtracking,Python,Function,Recursion,Backtracking,我有这个代码来计算进行更改的最小硬币数量。一个是非递归版本,由函数change调用,递归回溯函数名为get\u min\u coin\u configuration。在后一个函数中,我缓存以前计算的结果。我认为这应该加快进程。但事实上,它比不缓存结果的非递归方法慢得多。有没有线索说明为什么速度会慢一些? 这是完整的代码 cat minimumcoinrecurse.py import timeit def change(amount): money = () for coin

我有这个代码来计算进行更改的最小硬币数量。一个是非递归版本,由函数
change
调用,递归回溯函数名为
get\u min\u coin\u configuration
。在后一个函数中,我缓存以前计算的结果。我认为这应该加快进程。但事实上,它比不缓存结果的非递归方法慢得多。有没有线索说明为什么速度会慢一些? 这是完整的代码

cat minimumcoinrecurse.py 
import timeit
def change(amount):
    money = ()
    for coin in [25,10,5,1]:
        num = amount/coin
        money += (coin,) * num
        amount -= coin * num

    return money

#print change(63)
def get_min_coin_configuration(sum=None, coins=None, cache=None):
    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]
        #print cache
        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]
    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
        #print "second print", cache
        return cache[sum]
def main():
    print "recursive method"
    print "time taken",
    t=timeit.Timer('get_min_coin_configuration(63,[25,10,5,1])',"from __main__ import get_min_coin_configuration")
    print min(t.repeat(3,100))
    print get_min_coin_configuration(63,[25,10,5,1])
    print '*'*45
    print "non-recursive"
    print "time taken",
    t1=timeit.Timer('change(63)',"from __main__ import change")
    print min(t1.repeat(3,100))
    print change(63)
if __name__ == "__main__":
    main()

在您的评估中未使用缓存。此外,每次运行都会重新生成。比照

cache = {}
def main():
    print "recursive method"
    print "time taken",
通过明确指定缓存来使用缓存:


感谢您指出错误,我将函数头更改为
def get_min_coin_配置(sum=None,coins=None,cache={}):
现在运行良好..递归方法适用于小型输入,如
get_min_coin_配置(5[25,10,5,1])
。但是代码中的这一行应该是负值,
results=get\u min\u coin\u配置(sum-coin,coins,cache)
cache = {}
def main():
    print "recursive method"
    print "time taken",
    t=timeit.Timer('get_min_coin_configuration(63, [25,10,5,1], cache)',
                   'from __main__ import get_min_coin_configuration, cache')
    print min(t.repeat(3,100))
    print get_min_coin_configuration(63,[25,10,5,1])
    print '*'*45
    print "non-recursive"
    print "time taken",
    t1=timeit.Timer('change(63)',"from __main__ import change")
    print min(t1.repeat(3,100))
    print change(63)

recursive method
time taken 8.26920739926e-05
[25, 25, 10, 1, 1, 1]
*********************************************
non-recursive
time taken 0.000361219093488
(25, 25, 10, 1, 1, 1)