2013-11-08 3 views
0

Мне нужна помощь, потому что я думаю, что я потерялся. Я искал их раньше на этом сайте, и, конечно же, у меня есть это Google, но поверьте мне, что, если это было так просто для меня, я не спрашиваю об этом вообще, поэтому, пожалуйста, будьте добры ко мне. Я новичок в python и кодировании не так просто для меня.Код Python - я застрял - рекурсия

Во всяком случае, посмотрите на мой код:

def coin_problem(price, cash_coins): 
    if (price < 0): 
     return [] 
    if (price == 0): 
     return [[]] 

    options = [] 

    for a_coin in cash_coins: 
     coins_minus_coin = cash_coins[:] 
     coins_minus_coin.remove(a_coin) 
     sub_coin_problem = coin_problem (price - a_coin, cash_coins) 
     for coin in sub_coin_problem: 
      coin.append(a_coin) 
     options.extend(sub_coin_problem) 

    return options 

print coin_problem(4, [1, 2]) 

Как вы можете видеть, я пытался справиться с известной проблемой монеты рекурсией (и, как я уже писал, я знаю, что многие из них уже спросил об этом, я прочитал их вопросы и ответы, но я до сих пор не мог понять полностью решения).

Этот код был сделан мной, и все. И теперь я застрял и смутился. Когда значение «цены» 4, а значение «cash_coins» является [1,2] вместо возвращения что-то вроде этого:

[1,1,1,1] 
[2,2] 
[2,1,1] 

я получаю что-то подобное:

[[1, 1, 1, 1], [2, 1, 1], [1, 2, 1], [1, 1, 2], [2, 2]] 

в комбинация «2» и двойной «1» повторяется 3 раза вместо «1». Я не знаю, что мне делать, чтобы исправить проблему или улучшить код, чтобы он работал лучше.

+2

Я не вижу рекурсии, но вижу, что вы используете 'cash_coins' как итерабельную, так и функцию. – cmd

+0

cmd: Действительно, моя ошибка. проверить снова. Что теперь? Г-н. E: еще раз, моя ошибка. проверить снова. – user2969278

+0

Действительно ли 'cash_problem' должна быть' coin_problem'? – Izkata

ответ

2

Если вы хотите добавить один элемент в список, используйте append. Если вы хотите объединить два списка вместе, используйте extend.

0

Советы:

coins_minus_coin = cash_coins[:] 
    coins_minus_coin.remove(coin) 

Вы никогда не использовать эту переменную.

for i in sub_coins: 
     i.append(coin) 
    cash_coins_options.append(sub_coins) 

Вы никогда не используете i. Я предполагаю, что вы имели в виду:

for i in sub_coins: 
     i.append(coin) 
     cash_coins_options.append(i) 

Это решает проблему результатов Штанге, но ваше решение будет еще только найти []. Зачем? Ваша рекурсия может останавливаться только на return []; он не может справиться с другим фундаментальным случаем, когда вы можете рассказать цену с помощью одной монеты. Попробуйте добавить в верхней части это простое условие:

# actually I changed my mind- 
# I assume you're learning so try this one yourself :-) 

Это заставит вашу функцию вести себя намного лучше:

>>> print coin_problem(4, [1,2]) 
[[2, 1, 1], [1, 2, 1], [2, 2]] 

который удается производить правильные ответы (даже если он дублирует некоторые из них).

+0

Проверьте код еще раз. Я редактировал его. Благодарю. – user2969278

+0

Мне это больше понравилось :-) В основном вы переименовали переменные, я сделал то же самое с вашей новой версией и получил тот же результат. – Kos

Смежные вопросы