Go语言实现列出排列组合
今天,隔壁坐的小朋友给我一串数字:
1 6 21 55
让我观察规律,然后帮他推导公式。
尼玛,当我是神呢?!!
想了半天没看出个原委,
于是看了他那边具体需要才发现他那边是对N个数字进行5个数字的组合,
有多少种可能性的计算。
我一想,这不是初中学过的排列组合公式么。
显然,我忘记了,呵呵。
只记得大概是叫Pmn。
然后通过搜索引擎看到如下百度百科里面排列组合的几十这里:
http://baike.baidu.com/item/%E6%8E%92%E5%88%97%E7%BB%84%E5%90%88/706498

关键是当我用这个公式推导出上面数列里面的55是错的,应该是56.
小朋友不服啊!说他是一个一个手打出来检查过了的。
尼玛,不相信科学啊。
虽然他后面也相信这个公式了。
但是为了给他普及科学的强大,不要过分相信自己,也因为最近太闲,学得东西太杂,失去方向,于是就来练练Go语言吧。
我还是想办法去把这些排列组合打印粗来,代码写得难看,算法也是渣渣,但是勉强看吧:
package main import (
"fmt"
"strconv"
"strings"
) var a []int = []int{, , , , , , }
var rawLen int
var combineLen int func main() {
rawLen = len(a)
combineLen =
combine()
} func combine() {
fmt.Println("start combine")
arrLen := len(a) - combineLen
for i := ; i <= arrLen; i++ {
result := make([]int, combineLen)
result[] = a[i]
//fmt.Println(i, arrLen)
doProcess(result, i, )
}
} func doProcess(result []int, rawIndex int, curIndex int) {
var choice int = rawLen - rawIndex + curIndex - combineLen
//fmt.Printf("Choice: %d, rawLen: %d, rawIndex : %d, curIndex : %d \r\n", choice, rawLen, rawIndex, curIndex)
var tResult []int
for i := ; i < choice; i++ {
if i != {
tResult := make([]int, combineLen)
copyArr(result, tResult)
} else {
tResult = result
}
//fmt.Println(curIndex)
tResult[curIndex] = a[i++rawIndex] if curIndex+ == combineLen {
PrintIntArr(tResult)
continue
} else {
doProcess(tResult, rawIndex+i+, curIndex+)
} }
} func copyArr(rawArr []int, target []int) {
for i := ; i < len(rawArr); i++ {
target[i] = rawArr[i]
}
} func PrintIntArr(arr []int) {
valuesText := []string{}
for i := range arr {
number := arr[i]
text := strconv.Itoa(number)
valuesText = append(valuesText, text)
} fmt.Println(strings.Join(valuesText, ","))
}
说明:
a:是用来组合的的所有数字,要保证他们的唯一性,不要出现重复的元素,不一定要保证顺序;
combineLen:需要组合成的长度
实现原理的关键点在这一句:
var choice int = rawLen - rawIndex + curIndex - combineLen
这句话的意思是什么呢?
此位置的可用种类 = 原始数组上都 - 原始数组里面当前循环到的位置索引 + 当前结果数组的索引 - 需要合成的数组的长度
啥意思呢?
怎么体会呢?
假设我们是长度为6的数组,我们要做成10个数字的组合,假设在循环原数组的第一个位置,索引为0的时候,我们目标数组的可选数有:
10 - 0 + 0 - 5 = 5
也就是0 - 5的索引即6中选择,在唯一元素的数组里面,你可以配合排序去理解,也就是:
0 1 2 3 4 5 6 7 8 9
中第一个位置的可选是 0 1 2 3 4 5中选择,假设6,7,8,9可选,那么后面是无法补齐到5个数字的。
后面的任意索引都是以此类推。
以下结果是以5个元素3个数字进行组合的结果:

这个故事告诉我们,程序行业还是要好好学习数学,最少得初中学历。
Go语言实现列出排列组合的更多相关文章
- 自然语言处理(NLP) - 数学基础(1) - 排列组合
正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先 ...
- 学习sql中的排列组合,在园子里搜着看于是。。。
学习sql中的排列组合,在园子里搜着看,看到篇文章,于是自己(新手)用了最最原始的sql去写出来: --需求----B, C, F, M and S住在一座房子的不同楼层.--B 不住顶层.C 不住底 ...
- 算法:C++排列组合
题目:给定1-n数字,排列组合. 解法:递归.第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出.用数组表示n个数字,用过的数字置0. 实现语言:C++ #include <ios ...
- python 实现排列组合
1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__ ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- cb47a_c++_STL_算法_排列组合next_prev_permutation
cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
随机推荐
- 批量创建IP方法
以下教程,将告诉大家如何在Windows系统中通过命令行,批量添加IP.目标,在本机的的网卡名称为“本地连接”的网卡中,批量添加192.168.1段的ip地址,起开始IP为10,每次增加1,知道22为 ...
- linux上安装配置samba服务器
linux上安装配置samba服务器 在linux上安装配置samba服务器 在这给大家介绍一个不错的家伙,samba服务.如果您正在犯愁,如何在Windows和Linux之间实现资源共享,就请看看这 ...
- PHP关于表单提交 后 post get分页
PHP关于表单提交后分页函数的那点事--POST表单分页实现 phpfunctionclass加密inputjavascript 说到分页,其实你在Google一搜一大把.大部是通过GET ...
- akka 入门
http://blog.csdn.net/thkhxm/article/details/40182835 1.首先安装akka的相关包-- http://akka.io/downloads/2.导入依 ...
- 让你瞬间萌比的35个python小技巧
今天在看python算法的时候,看到一篇关于python的小技巧.瞬间萌比了,原来python也可以这样玩,太神奇了.萌比的是原来这么简单的东西自己都不知道,虽然会写.废话不多说了,开始上菜. 1.拆 ...
- utf8 文件 错误保存为gbk 中文乱码 解决方法
用zend studio 将utf-8 格式的文件 保存为 gbk 了,之后无论怎么装换 中文都是乱码 用 beyond compare(文件比较工具 对编码支持的比较强大) 打开,改下编码,中文就 ...
- .htaccess文件url重写小记
.htaccess文件url重写 当上一条规则匹配 并转换后 符合下一条规则的 继续下一条的匹配转换 RewriteRule ^shangpin-([0-9a-zA-Z]+)/category-([0 ...
- 运维必备:Oracle自备份精简教程(linux及win)
Oracle在linux环境下的自动备份 1.自动导出及历史文件删除脚本 su - oracle<<EOF cd /db_backup/databak mv orabak*.* /db_b ...
- PHP之输出控制 ob_start(),ob_get_contents(),ob_end_clean()
1.常用函数 ob_start();#打开输出缓冲区 ob_get_contents();#获取缓冲区内容 ob_get_length();#获取缓冲区内容长度 ob_clean();#清除之前的所有 ...
- Oracle 锁
select for update对某行加锁之后: select语句可以执行: select for update 这行不可以: 会一直等待锁释放 select for update wait 3 ...