Ychan 发表于 2020-6-20 13:53:09

算术题

本帖最后由 Ychan 于 2020-6-20 14:09 编辑

据说3个女人一台戏,
怎么求30个女人多少台戏呢?

print('A\t B\t C')
for A in range(1, 31):
    for B in range(1, 31):
      for C in range(1, 31):
            if A != B and A != C and B !=C:
                print(A, '\t', B, '\t', C)

我只能想到这样了
可是有很多重复的结果

又好像不应该这样表达。。
各位帮帮手T>T

java2python 发表于 2020-6-20 14:00:15

干嘛30个,汉诺塔100个,干嘛呢,吓人吗?
def permutation(n,floor,per):
    for pos in range(n):
      if len(set(per + )) == floor:
            if floor == n:
                  yield
            else:
                  for result in permutation(n,floor+1, per + ):
                            yield + result

for res in permutation(4,1,[]):
    print(res)
结果:























Twilight6 发表于 2020-6-20 14:15:51


print('A\tB\tC')
tempA = range(1,31)
count = 0
for A in range(len(tempA)):
    tempB = tempA
    for B in range(len(tempB)):
      tempC = tempB
      for C in range(len(tempC)):
            print(tempA,'\t',tempB, '\t',tempC)
            count += 1
print('30个女人',count,'台戏')

Python初学者8号 发表于 2020-6-21 09:32:55

三个女人一台戏,难道不是,4个就是C四一吗,可以调用排列组合的那个吧

java2python 发表于 2020-6-21 09:51:58

Python初学者8号 发表于 2020-6-21 09:32
三个女人一台戏,难道不是,4个就是C四一吗,可以调用排列组合的那个吧

这个就是组合C(30,3),我的程序是全排列的,是不对的

Python初学者8号 发表于 2020-6-21 10:10:56

java2python 发表于 2020-6-21 09:51
这个就是组合C(30,3),我的程序是全排列的,是不对的

哦哦 ,好吧,我看 了这最佳答案的运行结果,我觉得可以在你的自己的基础之上改吧(虽然我还没写),方法为:在你的基础之上,对每个输出的数据的元素进行大小排序,这样的话1 2 3和 1 3 2 就可以视为一个。当然这个方法没最佳答案的简洁了。希望可以帮助到你

java2python 发表于 2020-6-21 10:58:20

Python初学者8号 发表于 2020-6-21 10:10
哦哦 ,好吧,我看 了这最佳答案的运行结果,我觉得可以在你的自己的基础之上改吧(虽然我还没写),方法 ...

n个里取c个的组合算法:
def combination(n,c,limit=0,per=[]):
    for pos in range(limit,n):
      t = per +
      if len(set(t)) == len(t):
            if len(t) == c:
                  yield
            else:
                  for result in combination(n,c,pos, per + ):
                            yield + result
print("组合:")
for res in combination(5,3):
    print(res)
结果:
组合(5个中取3个):









java2python 发表于 2020-6-21 11:18:37

又改成可以同时对应排列,组合的(组合就是每次取得必须是大于之前的,排列就是每次都从0开始选):
def combination(n,c,com=1,limit=0,per=[]):
    for pos in range(limit,n):
      t = per +
      if len(set(t)) == len(t):
            if len(t) == c:
                  yield
            else:
                  for result in combination(n,c,com,com*pos, per + ):
                            yield + result
print("排列:")
for res in combination(5,3,0):
    print(res)

print("组合:")
for res in combination(5,3):
    print(res)


结果:
排列:




























































组合:









Python初学者8号 发表于 2020-6-21 12:11:37

java2python 发表于 2020-6-21 10:58
n个里取c个的组合算法:

结果:


对对 是这个意思我还写不出来反正我的想法实现了肯定比你的麻烦谢谢你了{:5_109:}
页: [1]
查看完整版本: 算术题