2017-04-17 18 views
1

私はこの数学の問題を解決するためにいくつかのコードを書こうとしています:8チームあり、それらのすべてがお互いにフットボールの試合をプレイします(合計7 + 6 + ... + 1 = 28試合)、勝ち負けの2つのチャンスがあります。各チームには少なくとも1勝1敗の戦闘がいくつあるかがあります。あなたが質問を得ることができなかったならば、私は再び説明しようとしてください。問題は私のコードが無限に増えていくことです(無限ループです。何が問題なのかを理解するために関数print文を書いた)。ここで私のコードは何だと思いますか?ありがとうございました。再帰関数は無限にpythonを回し続ける

num = 8 
team = [0,0,0,0,0,0,0,0] 
order = [] 
how_many_stats = 0 
temp = 0 

for i in range(num): 
    for t in range(i+1 , num): 
     order.append([i,t]) 
total_matches = len(order) - 1 
curr_matches = - 1 

def do_match(): 
    global num 
    global team 
    global order 
    global how_many_stats 
    global temp 
    global total_matches 
    global curr_matches 
    print(how_many_stats) 
    curr_matches += 1 
    team[order[curr_matches][0]] += 1        # first wins 

    if not curr_matches == total_matches: 
     do_match() 
    else: 
     for i in range(num): 
      if team[i] > 0 and team[i] < 7:           #7/8? 
       temp += 1 

     if temp == num: 
      how_many_stats += 1 
     temp = 0 


    team[order[curr_matches][0]] -= 1        # take back the action 

    team[order[curr_matches][1]] += 1        # second wins 

    if not curr_matches == total_matches: 
     do_match() 
    else: 
     for i in range(num): 
      if team[i] > 0 and team[i] < 7:           #7/8? 
       temp += 1 

     if temp == num: 
      how_many_stats += 1 
     temp = 0 


    team[order[curr_matches][1]] -= 1 

    curr_matches -= 1 
    return 

do_match() 
print(how_many_stats) 

Explainment:私はゲームのための道路を宣言し、(などの第三チーム対第二チーム対1チーム、第一チーム)の配列にそれらを取った後、私はその配列の順に行動にそれらを取りました。この道が条件を満たしているかどうかにかかわらず、各ゲームの勝利と敗北についてのツリーを構築し、各支店の終わりにコントロール構造を構築する可能性があります。もしhow_many_statsの値が1になったらもう一度やり直してもう一度やり直してください。もし満たされなければもう一度歩いて1歩前に戻ってみましょう。すでに2つのノードの両方が見えたら、もう一度やり直してください。

答えて

1

ライン21にいくつかのデバッグロジックを追加した後:

print("called do_match with num: %d, team: %s, order: %s, how_many_stats: %d, temp: %d, total_matchs: %d, curr_matches: %d" % (
    num, str(team), str(order), how_many_stats, temp, total_matches, curr_matches 
)) 

、それは少しのために実行させることを:

called do_match with num: 8, team: [7, 4, 4, 1, 4, 1, 2, 4], order: [[0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 4], [3, 5], [3, 6], [3, 7], [4, 5], [4, 6], [4, 7], [5, 6], [5, 7], [6, 7]], how_many_stats: 0, temp: 0, total_matchs: 27, curr_matches: 26 
called do_match with num: 8, team: [7, 4, 4, 1, 4, 0, 3, 3], order: [[0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 4], [3, 5], [3, 6], [3, 7], [4, 5], [4, 6], [4, 7], [5, 6], [5, 7], [6, 7]], how_many_stats: 0, temp: 0, total_matchs: 27, curr_matches: 25 
... 
called do_match with num: 8, team: [7, 4, 4, 1, 3, 1, 3, 4], order: [[0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 4], [3, 5], [3, 6], [3, 7], [4, 5], [4, 6], [4, 7], [5, 6], [5, 7], [6, 7]], how_many_stats: 0, temp: 0, total_matchs: 27, curr_matches: 26 
called do_match with num: 8, team: [7, 4, 4, 1, 3, 0, 4, 3], order: [[0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [0, 6], [0, 7], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 4], [3, 5], [3, 6], [3, 7], [4, 5], [4, 6], [4, 7], [5, 6], [5, 7], [6, 7]], how_many_stats: 0, temp: 0, total_matchs: 27, curr_matches: 25 

私はあなたのコードが終了しないことを、結論に来て、あなたの問題はそのマッチツリーには多すぎる可能性があるということです。

called do_match with num: 4, team: [0, 0, 0, 0], order: [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]], how_many_stats: 0, temp: 0, total_matchs: 5, curr_matches: -1 
.... 
called do_match with num: 4, team: [0, 1, 2, 2], order: [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]], how_many_stats: 32, temp: 0, total_matchs: 5, curr_matches: 4 
32 

ですから、brute-なし一致の数を計算することができる、より良いアルゴリズムを把握する必要があります:4にチームの数を減らして、もう一度実行して、それが実際に終了例について

、試合ツリーを強制し、少なくとも1勝と1

Foのを失う

のあなたの条件に一致する結果を数えますたとえば、各チームが正確に1つの勝ち、あるいはただ1つのルーズを持つ可能性の数を数え、可能な結果の総量から差し引くことができます(これを両方の部分として2回カウントしないようにするか、

target=total_number-exactly_one_win-exactly_one_loss+exactly_one_win_and_one_loss 
+0

ええ、それは本当にかなりブルートフォースです。しかし、ブルートフォースは、プロセスはちょうど長い時間がかかりますが、私は間違っている間違った結果を与えていないことを意味しますか?なぜこのアルゴリズムが間違った結果をもたらすのではないのでしょうか?さまよっただけで、あなたの時間をありがとう。 –

+0

あなたは正しいです、出力を見ると、すべてのチームのカウントが0より大きいラインのみをカウントする必要があります。そうしないと、1つの勝利を必要とし、それができません。しかし、理由を理解するために、私は実際にあなたのコードを理解しなければならないでしょう....だから両方の問題を解決するべき別のアプローチの私の更新答えを見てください。 –