鱼C论坛

 找回密码
 立即注册
查看: 6660|回复: 11

[已解决]请帮忙解释求n个数中取r个数的组合的算法

[复制链接]
发表于 2016-5-13 12:52:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 vpo1 于 2016-5-16 16:11 编辑
  1. def creat_all(n, r):
  2.     # combinations('ABCD', 2) --> AB AC AD BC BD CD
  3.     # combinations(range(4), 3) --> 012 013 023 123
  4.     n_list =[]
  5.     for i in range(1,n+1):
  6.         n_list.append(i)
  7.     pool = tuple(n_list)#到这里都是懂的,是创建了一个1—n的元组
  8.     #print(pool)
  9.     file_name = open("全组合.csv",'w',newline='')
  10.     wr = csv.writer(file_name)#打开文件,准备写入,这里newline=‘’很关键,会阻止写入时创建空行
  11.     if r > n:
  12.         return#如果r大于n,显然错误
  13.     indices = list(range(r))#生成一个列表,即0—r-1的列表,从这里开始看不懂了。。。。。
  14.     wr.writerow(list(pool[i] for i in indices))#写入的第一个组合,最小的组合
  15.     #
  16.     #print(indices)
  17.     while True:
  18.         for i in reversed(range(r)):#返回序列range(r)的反向访问的迭代子。
  19.             if indices[i] != i + n - r:#这里就看不懂了,为什么呢
  20.                 break
  21.         else:#这里更奇怪了,这个else对应上面的if吗?好像是不对应的,那么单独的esle。。。。。。。
  22.             return
  23.         indices[i] += 1#为什么要+1
  24.         for j in range(i+1, r):
  25.             indices[j] = indices[j-1] + 1#还是没搞懂
  26.         wr.writerow(list(pool[i] for i in indices))
  27.         #求注释
  28.         
  29.     file_name.close()
复制代码

这个是我写来用于生成n选r组合的一个函数,用于双色球模拟的。在其中走了很多弯路,因为生成一注随机数很简单,全部列举可能组合就比较麻烦了。其中combinations,是一个生成组合的直接可用的方法,需要from itertools import combinations 。但是combintions生成如此大的数据,会给内存带来溢出。所以就弄成了,生成后写入文件的方式,这段代码的核心部分(生成组合)是复制的,自己摸索着可用了,但是完全不理解其中的写法。求高手注释指点。多谢!多谢!
顺便说一句,根据这个函数,生成的33选6的双色球组合,共有1107568种。如果再考虑到蓝球1—16,那就是17721088种
最佳答案
2016-5-13 13:20:35
本帖最后由 老忘 于 2016-5-13 15:09 编辑
  1. ......
  2. while True:
  3.         for i in reversed(range(r)):
  4.             if indices[i] != i + n - r:
  5.                 break
  6.         else:#这里的else不是对应上一个if,而是对应上一个for循环,就是说如果上一个for循环没有走到break,那么就执行这一条语句。
  7.             return
  8.         indices[i] += 1
  9.         for j in range(i+1, r):
  10.             indices[j] = indices[j-1] + 1
  11.         wr.writerow(list(pool[i] for i in indices))
  12. ......
复制代码



我正好学到小甲鱼的《034丰富的else语句及简洁的with语句》这一课,有提到else的用法,楼主可以看一下。


楼主是否是想告诉我们,彩票中奖机率太小,还是老老实实学好python比较好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-13 13:20:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 老忘 于 2016-5-13 15:09 编辑
  1. ......
  2. while True:
  3.         for i in reversed(range(r)):
  4.             if indices[i] != i + n - r:
  5.                 break
  6.         else:#这里的else不是对应上一个if,而是对应上一个for循环,就是说如果上一个for循环没有走到break,那么就执行这一条语句。
  7.             return
  8.         indices[i] += 1
  9.         for j in range(i+1, r):
  10.             indices[j] = indices[j-1] + 1
  11.         wr.writerow(list(pool[i] for i in indices))
  12. ......
复制代码



我正好学到小甲鱼的《034丰富的else语句及简洁的with语句》这一课,有提到else的用法,楼主可以看一下。


楼主是否是想告诉我们,彩票中奖机率太小,还是老老实实学好python比较好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-14 23:00:51 | 显示全部楼层
按照你的说法,这个else和if对应也没有问题吧?但实际执行结果是不一样的,如果else和if对应,则只生成很少一部分组合,如果和for对应,则会生成全部组合。
还是求高手帮忙注释下组合的算法部分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-15 11:19:18 | 显示全部楼层
那里的那个else对应for,
在python中,if,for,while,try都可以有else。
for中的else的意思是如果这个for循环完成则执行else后的语句。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-16 11:25:54 | 显示全部楼层
关于else的问题,感谢讲解,求组合的这个算法是个什么思路,哪位大神能给讲解下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-17 12:18:59 | 显示全部楼层
有人能帮忙吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-17 15:27:22 | 显示全部楼层
来看看大神代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-17 17:42:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-18 10:34:47 | 显示全部楼层
@冬雪雪冬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-18 20:36:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-19 10:10:21 | 显示全部楼层
没人回答我的问题。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-20 08:57:54 | 显示全部楼层
@冬雪雪冬
我看到论坛好多问题,都是@冬雪雪冬解决的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-21 00:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表