写一个递归函数,输入一个正整数n并输出{1,2,...的所有排列。 。 。 ,n}

时间:2016-10-09 21:09:13

标签: python sage

我在解决此任务时遇到了问题:

  

写一个输入正整数n和的递归函数   输出所有n! {1,2,...的排列。 。 。 ,n}。不要使用任何   Sage的排列命令。使用列表存储值和工作   那个清单。

示例输入:<script type="text/javascript" src="/path/to/main.js" charset="utf-8"></script>

预期输出:3

我在网上找到的所有内容都会生成列表的排列,而不是整数。

我想到计算我的阶乘将有助于确定我的输出长度。我不知道我该怎么做。请帮帮我!谢谢 !

我试过这个

(1,2,3), (1,3,2), (2,3,1),(2,1,3), (3,1,2), (3,2,1)

[(0,0,2),(0,1,1),(0,2,0),(1,0,1),(1,1,0),(2,0,0) )]

2 个答案:

答案 0 :(得分:2)

您可以使用backtracking algorithm来获取排列:

def backtrack(n=None, arr=None,  i=0, out=None):
    if out is None:
        out = []
        arr = list(range(1, n + 1))
    if i == n:
        out.append(tuple(arr))
    else:
        for j in range(i, len(arr)):
            arr[i], arr[j] = arr[j], arr[i]
            backtrack(n, arr, i + 1, out)
            arr[i], arr[j] = arr[j], arr[i]
    return out

只需传递元素数量:

In [18]: backtrack(3)
Out[18]: [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 2, 1), (3, 1, 2)]

或使用生成器功能:

def backtrack(n=None, arr=None,  i=0):
    if arr is None:
        arr = list(range(1, n + 1))
    if i == n:
        yield (tuple(arr))
    else:
        for j in range(i, len(arr)):
            arr[i], arr[j] = arr[j], arr[i]
            yield from backtrack(n, arr, i + 1)
            arr[i], arr[j] = arr[j], arr[i]



print(list(backtrack(3)))

答案 1 :(得分:1)

编辑:我创建的解决方案不使用任何模块并且可以递归工作:

def per(n, current_perm=[], results=[], remaining=None):
    if remaining is None:
        # Create a list of all items
        remaining = list(range(1, n+1))
    if len(remaining) == 1:
        # Only one item remaining - combine with
        # current path and add to results
        current_perm.append(remaining[0])
        results.append(current_perm)
        return
    for item in remaining:
        # Create a copy of the remaining list
        # and the current_permutation
        rem = list(remaining)
        cur = list(current_perm)
        # Remove the current item from the copy
        rem.remove(item)
        # Add the item to the current path
        cur.append(item)
        per(n, cur, results, rem)
    return results

print(per(3))

输出: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]