递归数字生成器无法正常工作

时间:2013-12-04 20:21:12

标签: python list recursion

我正在学习python,在尝试编写一个简单的乐透程序时,我遇到了一个小问题。

我要做的是生成两个列表,每个列表包含六个数字。第一个是通过询问用户输入数字而生成的。

第二个使用randint

生成1到49之间的随机整数

如果我这样编码:

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]

似乎只生成一次数字 我不明白的是为什么。有人可以帮助我让递归函数工作吗?

2 个答案:

答案 0 :(得分: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('....'))(不带参数),或者使用参数randint1调用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]

答案 1 :(得分:0)

你的问题在

   return zahlen (schein,zahl)

在这里,您使用第一次调用时使用的相同整数zahlen调用zahl。尝试将其替换为:

return zahlen(schein, int(input("Bitte geben sie eine Zahl ein: ")))