2013-03-17 89 views
0

我必须编写一个使用递归生成列表的代码,但列表中的最后一项需要为空。这是我的代码,我需要它来生产它与实际生产的产品。如何在python中结束列表?

def coin_change(avail_change, total_cents): 
    if avail_change == []: 
     return [] 
    if total_cents // avail_change[0] >= 1: 
     first = total_cents // avail_change[0] 
     first_list = [avail_change[0], first] 
     return [first_list, coin_change(avail_change[1:], (total_cents - (avail_change[0] * first)))] 
    else: 
     return coin_change(avail_change[1:], total_cents) 

结果:

coin_change([50,5,1],108) => [[50,2],[5,1],[1,3]] 
expected [[50, 2], [5, 1], [1, 3]], saw [[50, 2], [[5, 1], [[1, 3], []]]] 

我需要[1,3]后列表结束,但我不知道该怎么办。

+1

如果你留下了一个空表为什么要返回一个空列表? – Makoto 2013-03-17 20:35:31

+3

请注意,检查空列表的pythonic方法是“if some_list:”,而不是“if some_list == []:'”。 – 2013-03-17 20:36:40

+0

将[first_list,coin_change(avail_change [1:],(total_cents - (avail_change [0] * first)))]'变更为'[first_list] + coin_change(avail_change [1:],(total_cents - (avail_change [0 ] *第一)))'。 '[list1,list2]'不等于'[list1] + list2'。 – nymk 2013-03-17 20:50:42

回答

0

您正在为每个递归调用返回一个列表,因此结果是日益嵌套的列表之一。你也应该返回两元组而不是列表。列表的目的是可变的和非固定的长度,但你的(面额,数量)对既不是。

此外,只是为了好玩,coin_change([3,2],16)的输出是什么,你会期望它是什么?

1

当您使用递归时,首先考虑您的基本情况,以及它如何与以前的调用相结合。在这个问题中,如果你做return [first_list, ...那么你嵌套的结果。相反,你必须在同一个列表中插入新的结果。

def coin_change(avail_change, total_cents): 
    if not avail_change: 
     return [] 
    else: 
     first = total_cents // avail_change[0] 
     result = coin_change(avail_change[1:], (total_cents % avail_change[0])) 
     if first > 0: 
      result.insert(0, [avail_change[0], first]) 
     return result 

print coin_change([50,5,1],108) # [[50, 2], [5, 1], [1, 3]] 
0
first_list = [] 


def coin_change(avail_change, total_cents): 
    if not avail_change: 
     return [] 

    if total_cents // avail_change[0] >= 1: 
     first = total_cents // avail_change[0] 
     first_list.append([avail_change[0], first]) 
     coin_change(avail_change[1:], (total_cents - (avail_change[0] * first))) 

    else: 
     coin_change(avail_change[1:], total_cents) 

    return first_list 

x = coin_change([50, 5, 1], 108) 
print x 

结果:
[[50,2],[5,1],[1,3]]如你想

X = coin_change([],108) 打印X

输出[]

0

这可有助于:

coins = [] 
def coin_change(avail_change, total_cents): 
    if avail_change == []: 
     raise Exception() 
    if total_cents // avail_change[0] >= 1: 
     first = total_cents // avail_change[0] 
     first_list = [avail_change[0], first] 
     coins.append(first_list) 
     try: 
      return coin_change(avail_change[1:], (total_cents - (avail_change[0] * first))) 
     except: 
      return coins 
    else: 
     try: 
      return coin_change(avail_change[1:], total_cents) 
     except: 
      return coins 

结果:

>>> coin_change ([50,5,1], 108) 
[[50, 2], [5, 1], [1, 3]]