0

英国の宝くじ番号 (1 から 49 までの 7 つの数字) を生成する簡単なスクリプトがあります。私のコードには、リストに7つの乱数を生成し、重複した数字を削除するリストで設定を実行し、リストにまだ7つのメンバーがあるかどうかを確認し、そうでない場合は関数がそれ自体を呼び出して7つの新しい数字を生成する関数があります。

ただし、関数がそれ自体を呼び出すと、リストは返されません。

ここで私が間違っていることを知っていただければ幸いです。

from random import randint

def lotto():

    l = []
    for r in range(1,8):
        l.append(randint(1,49))

    print "DEBUG: l=", l
    print "DEBUG: set(l)=", set(l), len(set(l))

    if(len(set(l)) !=7):
        lotto()
    else:
        print "Before return l, l = ", l
        return l

def main():
    numbers = lotto()
    print numbers

正しく動作しないサンプル実行を次に示します。

DEBUG: l= [44, 32, 12, 12, 33, 16, 31]
DEBUG: set(l)= set([32, 33, 44, 12, 16, 31]) 6
DEBUG: l= [46, 20, 10, 24, 16, 35, 44]
DEBUG: set(l)= set([35, 10, 44, 46, 16, 20, 24]) 7
Before return l, l =  [46, 20, 10, 24, 16, 35, 44]
None

そして、正しく動作するサンプル実行:

DEBUG: l= [20, 5, 21, 37, 10, 44, 38]
DEBUG: set(l)= set([37, 38, 10, 44, 20, 21, 5]) 7
Before return l, l =  [20, 5, 21, 37, 10, 44, 38]
[20, 5, 21, 37, 10, 44, 38]
4

2 に答える 2

3

再帰呼び出しの結果を返していません。

if(len(set(l)) !=7):
    return lotto()
于 2012-08-09T18:34:17.530 に答える
2

再帰呼び出し

lotto()

が返す値を実際に返すわけではありませんlotto()。使用する必要があります

return lotto()

代わりは。(末尾再帰呼び出しの代わりに、ループが望ましいことに注意してください。)

とはいえ、実際の問題にはもっと簡単な解決策がありますrandom.sample()。Python2.x バージョン:

import random
print random.sample(xrange(1, 50), 7)

Python 3.x バージョン:

import random
print(random.sample(range(1, 50), 7))
于 2012-08-09T18:34:22.740 に答える