2012-12-09 57 views
6

我想做一個簡單的遞歸函數,它將在Python中生成一個嵌套列表的列表。最終結果將代表一個淘汰賽錦標賽。我希望創建一個像這樣的列表將使我能夠輕鬆地生成我所需要的內容。這將在以後被用於爲比賽比賽創建模型。在Python中生成括號模型列表的算法

因此,如果有4名參加比賽:

[[1,4],[2,3]] 

的7人賽:

[[1,[4,5]],[[2,7],[3,6]]] 

或8名參與者的一場比賽:

[[[1,8],[4,5]],[[2,7],[3,6]]] 

我的天堂」 t還有一個算法類(我希望這個類會最終幫助像這樣的事情),所以我不完全肯定如何解決這個問題。以下是我迄今的嘗試。

def decide_rounds(list_to_fill, player_nums): 
    if len(player_nums) < 3: 
     for num in player_nums: 
      list_to_fill.append(num) 
     return 

    left = [] 
    decide_rounds(left, ??????) #Tried passing various things to these with no avail. 
    list_to_fill.append(left) 
    right = [] 
    decide_rounds(right, ???????) 
    list_to_fill.append(right) 

任何關於如何解決這個問題的幫助或解釋將不勝感激!

編輯:目前我打電話這樣的功能:

rounds = [] 
decide_rounds(rounds, range(1, size +1)) 
print rounds 
+3

嘗試:http://ideone.com/RVe8SQ – irrelephant

+2

@irrelephant肯定這應該是一個答案,而不是評論? –

+0

@irrelephant這是一個16位玩家:http://pastebin.com/sTT07iCj 如果按照正確的順序給出一個列表,您的原始答案可能會起作用,這可能可以通過某種簡單的函數來解決。 – computmaxer

回答

6

試試這個:

def divide(arr, depth, m): 
    if len(complements) <= depth: 
     complements.append(2 ** (depth + 2) + 1) 
    complement = complements[depth] 
    for i in range(2): 
     if complement - arr[i] <= m: 
      arr[i] = [arr[i], complement - arr[i]] 
      divide(arr[i], depth + 1, m) 

m = int(raw_input()) 

arr = [1, 2] 
complements = [] 

divide(arr, 0, m) 
print arr 

我們注意到,與2^N球員支架,每對的總和相同的數字。對於每一對,右邊的項由左邊的元素和遞歸的深度決定,所以我們可以先通過生成陣列深度繼續。我們記住補充來改進運行時間。它適用於任何m > 1,因爲一旦補碼太大,它會停止遞歸。

看到它在行動:http://ideone.com/26G1fB

+0

謝謝!這正是我想要的。說明是有道理的。真棒。 – computmaxer

+0

你能解釋一下這個算法嗎?還是有一個地方我可以看看這裏發生了什麼的解釋?無法準確理解正在發生的事情:) – AndrewD