2013-12-04 3 views
0

В настоящее время я изучаю python, и, пытаясь написать простую программу для лото, я столкнулся с небольшой проблемой.рекурсивный генератор чисел не работает

Я пытаюсь создать два списка, каждый из которых содержит шесть чисел. первый из них генерируется, запрашивая у пользователя число.

Второй генерирует случайные целые числа от 1 до 49 с помощью randint

Если я код так:

from random import randint 

lottoschein = [] 
gewinnzahlen = [] 

while (len(lottoschein)<6): 
    lottoschein.append(int(input("Bitte geben sie eine Zahl ein: ")))# Eingabeaufforderung 
    print (lottoschein) 
    print (len(lottoschein)) 


while (len(gewinnzahlen)<6): 
    zahl = randint (1,49) 
    gewinnzahlen.append(zahl) 
    print (gewinnzahlen) 

Это на самом деле работает и генерирует хороший выход, как

Bitte geben sie eine Zahl ein: 1 
[1] 
1 
Bitte geben sie eine Zahl ein: 5 
[1, 5] 
2 
Bitte geben sie eine Zahl ein: 4 
[1, 5, 4] 
3 
Bitte geben sie eine Zahl ein: 4 
[1, 5, 4, 4] 
4 
Bitte geben sie eine Zahl ein: 5 
[1, 5, 4, 4, 5] 
5 
Bitte geben sie eine Zahl ein: 8 
[1, 5, 4, 4, 5, 8] 
6 
[40] 
[40, 33] 
[40, 33, 42] 
[40, 33, 42, 20] 
[40, 33, 42, 20, 35] 
[40, 33, 42, 20, 35, 14] 

Только то, что я попросил.
Но если я пытаюсь кодирование его в рекурсивной функции следующим образом:

from random import randint 

lottoschein = [] 
gewinnzahlen = [] 

def zahlen (schein,zahl): 
    if(len(schein)<6): 
    schein.append(zahl) 
    return zahlen (schein,zahl) 
    else: 
    print (schein) 
    return schein 

lottoschein = zahlen (lottoschein, int(input("Bitte geben sie eine Zahl ein: "))) 
gewinnzahlen = zahlen (gewinnzahlen, randint (1,49)) 

возвращает вывод, как:

Bitte geben sie eine Zahl ein: 2 
[2, 2, 2, 2, 2, 2] 
[17, 17, 17, 17, 17, 17] 

кажется, что он генерирует число только один раз.
Я не понимаю, почему. Может ли кто-нибудь помочь мне получить рекурсивную функцию, работающую, пожалуйста?

+0

Вы просите номер только один раз! 'input (« Bitte geben Sie eine Zahl ein »)' происходит только один раз. Возможно, вам захочется переместить этот фрагмент кода внутри вашей функции zahlen. – chahuistle

+0

Я не могу использовать вход внутри моей функции zahlen, потому что тогда мне понадобится 2 функции. Один для ручного ввода другой для автоматической генерации. что сделало бы функциональное программирование совершенно бесполезным – Sulumar

ответ

1

Как только вы позвоните randint(), он возвращает число. Это , что номер, который передается в функцию, а не функцию.

Другими словами, вы вызываете функцию один раз и повторно используете выход снова и снова.

Вашей while петля, с другой стороны, повторно выполнить тело цикла каждую итерацию, так что в этом случае input() функции или randint() функции вызывается для каждой итерации цикла while и тем самым ввести новый номер.

Если вы хотите функцию с именем каждый раз, когда вы идете через петлю, проходят в функции и аргументы вместо:

def zahlen(schein, function, *arguments): 
    if len(schein) < 6: 
     schein.append(function(*arguments)) 
     return zahlen(schein, function, *arguments) 
    return schein 

и называют это с:

lottoschein = zahlen(lottoschein, lambda: int(input("Bitte geben sie eine Zahl ein: ")))) 
gewinnzahlen = zahlen(gewinnzahlen, randint, 1, 49) 

Теперь либо lambda: int(input('....')) (с без аргументов) вызывается каждый раз в рекурсивной функции, или randint вызывается с аргументами 1 и 49.

Демо:

>>> def zahlen(schein, function, *arguments): 
...  if len(schein) < 6: 
...   schein.append(function(*arguments)) 
...   return zahlen(schein, function, *arguments) 
...  return schein 
... 
>>> from random import randint 
>>> zahlen([], randint, 1, 49) 
[42, 11, 41, 28, 27, 24] 
>>> zahlen([], lambda: int(input('Please enter a number: '))) 
Please enter a number: 10 
Please enter a number: 20 
Please enter a number: 30 
Please enter a number: 42 
Please enter a number: 38 
Please enter a number: 2 
[10, 20, 30, 42, 38, 2] 
+0

Ну, если я попробую это, я получаю только SyntaxError: могу использовать выделенное выражение только в качестве цели назначения – Sulumar

+0

@Sulumar: вы использовали функцию точно так, как показано здесь? Какую версию Python вы используете? Я тестировал это как с Python 2.7, так и с 3.3. –

+0

My Bad работает как шарм thx. теперь я просто должен понять несколько деталей. – Sulumar

0

Ваша проблема заключается в линии

return zahlen (schein,zahl) 

Здесь вы звоните zahlen с таким же целым числом zahl, который был использован при первом вызове.Попробуйте заменить его на:

return zahlen(schein, int(input("Bitte geben sie eine Zahl ein: "))) 
Смежные вопросы