我在解决此任务时遇到了问题:
写一个输入正整数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) )]
答案 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]]