下面大神的讨论我看得有点晕,所以我也来补充说明好了,假设原来顺序是 ABCDE
第一种情况:A选任意位置,有4种可能。
------------------------------------------------------------
第二种情况:AB互换位置。
表示从AB_ _ _变成了BA_ _ _
剩下的CDE只可能有BADEC跟BAECD两种可能
第三种情况:A选了B的位置,但是B不选A的位置。表示为 _ A B B B
因为不选A的位置只有三种可能,同时C在不选自己的位置加上两个位置已有人的情况下也有三种可能,在三个位置都决定的情况下剩下两个只能互换。
所以最终是4*(2+3*3)
l = list(range(5)) res = [] def fun(tmp, start, end): if start == end: res.append(tmp.copy()) return for i in range(start, end): tmp[start], tmp[i] = tmp[i], tmp[start] fun(tmp, start+1, end) tmp[start], tmp[i] = tmp[i], tmp[start] fun(l, 0, 5) num = 0 for e in res: sign = False for i in range(5): if e[i] == i: sign = True break if not sign: num += 1 print(num)