在Python中生成括号模型列表的算法

com*_*xer 7 python algorithm

我正在尝试创建一个简单的递归函数,它将在Python中生成嵌套列表的列表.最终结果将代表单个淘汰赛锦标赛.我希望创建这样的列表可以让我轻松生成我需要的东西.这将在以后用于为锦标赛比赛创建模型.

所以,如果有4名参赛者的锦标赛:

[[1,4],[2,3]]
Run Code Online (Sandbox Code Playgroud)

7名参赛者的比赛:

[[1,[4,5]],[[2,7],[3,6]]]
Run Code Online (Sandbox Code Playgroud)

或者是8名参赛者的比赛:

[[[1,8],[4,5]],[[2,7],[3,6]]]
Run Code Online (Sandbox Code Playgroud)

我还没有算法类(我希望课程最终会帮助这样的事情)所以我不完全确定如何解决这个问题.以下是我到目前为止的尝试.

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)
Run Code Online (Sandbox Code Playgroud)

任何有关如何处理此问题的帮助或解释将不胜感激!

编辑:目前我正在调用这样的函数:

rounds = []
decide_rounds(rounds, range(1, size +1))
print rounds
Run Code Online (Sandbox Code Playgroud)

irr*_*ant 8

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

我们注意到对于具有2 ^ n个玩家的支架,每对的总和是相同的数字.对于每一对,正确的术语由左元素和递归的深度决定,因此我们可以先进行生成数组深度.我们记住补充以稍微改善运行时间.它适用于任何m > 1因为一旦补码太大就停止递归.

请参阅实际操作:http://ideone.com/26G1fB