背景:
这个问题涉及对从1到n的数字进行排列,并为每个数字分配正号或负号。
长度为n的带符号排列包括按照特定顺序排列数字1到n,然后为每个数字分配正号或负号。
这个题目也是一个数学问题,一个求排列组合的数学问题,我们来说说,如果给定了一个n,到底有多少种排列方法:
- 首先,长度为n的排列总数为n的阶乘,即n!
- 对于每个长度为n的排列,可以为每个数字分配正号或负号。因此,对于每个数字有两种选择(正号或负号),总的排列方式为2的n次方。
- 因此,长度为n的带符号排列的总数为 种。
题目的要求:
- 给定:一个小于6的正整数
- 返回:给定n的所有带符号排列的方法的总数,并列出这些排列(顺序随意)。
解决方法:
我们可以使用python中,itertools包中的permutations函数进行解答,这个函数提供了一种方便的方法来生成所有可能的排列,我们可以新建一个列表,把题目给定的1~n的数全部放进去,包括负数,假如题目给了一个 2,我们这个列表就为[1,-1,2,-2],以此类推。然后用这个长度为2n的数组,使用permutations函数生成长度为2的排列。注意,有可能会出现(1,-1),即两个数绝对值相等的情况。所以每生成一个排列,我们要把里面的数检查一遍,看看有没有存在绝对值相等的一组数,如果有,我们就抛弃这个排列。
代码:
import itertools
def is_Scalar(args): #判断函数,判断集合中有无“重复的值”(取绝对值后)
args = [abs(i) for i in args]
for i in args:
if args.count(i)>1:
return False
return True
n = ?
data = []
for i in range(1,n+1):
data.append(i)
data.append(-1*i)
res=[]
per_list = itertools.permutations(data,n)
for i in per_list:
if is_Scalar(i):
res.append(i)
print(len(res))
for i in res: #根据题目要求输出
i = list(i) #tuple --> list
i = map(lambda x:str(x),i) #list里的值 int ---> str
print(' '.join(i))