浏览 2662 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-19
最后修改:2008-12-19
写一个遍历组合数的方法(任意语言实现),如: function combine(array,m){ //................. return rusult; } 如果array是[1,2,3],m为2,则返回的result应该是[[1,2],[1,3],[2,3]]; 补充:从m个不同元素中取出n(n≦m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-19
http://laiseeme.iteye.com/admin/blogs/179054
|
|
返回顶楼 | |
发表时间:2008-12-19
再出一基础题,写一正则表达式,要求匹配这样这的格式:
1,是三个数字 2,这三个数字有两个是相同的,另一个不相同 如:112,565,889都能匹配,但123,666不能匹配。 |
|
返回顶楼 | |
发表时间:2008-12-19
(define (kombine items m) (cond ((null? items) (list '())) ((= m 1) items) (else (flatmap (lambda (x) (map (lambda (p) (if (> m 2) (cons x p) (cons x (cons p '())))) (kombine (remove x items) (- m 1)))) items)))) (define (remove item sequence) (filter (lambda (x) (not (= x item))) sequence)) (kombine '(1 2 3 4 5) 4) ((1 2 3 4) (1 2 3 5) (1 2 4 3) (1 2 4 5) (1 2 5 3) (1 2 5 4) (1 3 2 4) (1 3 2 5) (1 3 4 2) (1 3 4 5) (1 3 5 2) (1 3 5 4) (1 4 2 3) (1 4 2 5) (1 4 3 2) (1 4 3 5) (1 4 5 2) (1 4 5 3) (1 5 2 3) (1 5 2 4) (1 5 3 2) (1 5 3 4) (1 5 4 2) (1 5 4 3) (2 1 3 4) (2 1 3 5) (2 1 4 3) (2 1 4 5) (2 1 5 3) (2 1 5 4) (2 3 1 4) (2 3 1 5) (2 3 4 1) (2 3 4 5) (2 3 5 1) (2 3 5 4) (2 4 1 3) (2 4 1 5) (2 4 3 1) (2 4 3 5) (2 4 5 1) (2 4 5 3) (2 5 1 3) (2 5 1 4) (2 5 3 1) (2 5 3 4) (2 5 4 1) (2 5 4 3) (3 1 2 4) (3 1 2 5) (3 1 4 2) (3 1 4 5) (3 1 5 2) (3 1 5 4) (3 2 1 4) (3 2 1 5) (3 2 4 1) (3 2 4 5) (3 2 5 1) (3 2 5 4) (3 4 1 2) (3 4 1 5) (3 4 2 1) (3 4 2 5) (3 4 5 1) (3 4 5 2) (3 5 1 2) (3 5 1 4) (3 5 2 1) (3 5 2 4) (3 5 4 1) (3 5 4 2) (4 1 2 3) (4 1 2 5) (4 1 3 2) (4 1 3 5) (4 1 5 2) (4 1 5 3) (4 2 1 3) (4 2 1 5) (4 2 3 1) (4 2 3 5) (4 2 5 1) (4 2 5 3) (4 3 1 2) (4 3 1 5) (4 3 2 1) (4 3 2 5) (4 3 5 1) (4 3 5 2) (4 5 1 2) (4 5 1 3) (4 5 2 1) (4 5 2 3) (4 5 3 1) (4 5 3 2) (5 1 2 3) (5 1 2 4) (5 1 3 2) (5 1 3 4) (5 1 4 2) (5 1 4 3) (5 2 1 3) (5 2 1 4) (5 2 3 1) (5 2 3 4) (5 2 4 1) (5 2 4 3) (5 3 1 2) (5 3 1 4) (5 3 2 1) (5 3 2 4) (5 3 4 1) (5 3 4 2) (5 4 1 2) (5 4 1 3) (5 4 2 1) (5 4 2 3) (5 4 3 1) (5 4 3 2)) |
|
返回顶楼 | |
发表时间:2008-12-19
最后修改:2008-12-19
楼上是个递归版本,我提供个非递归的
function combine(vec, m){ var result = new Array(); var vecm = new Array(); var vecb = new Array(); var mark; // 初始化 for (var i = 0; i < m; i++) vecm[i] = i; for (var i = 0; i < m - 1; i++) vecb[i] = i; vecb[m - 1] = vec.length - 1; mark = m - 1; output(); while (true) { if (mark == 0) { vecm[0]++; output(); if (vecm[0] == vecb[0]) { for (i = 1; i < m; i++) { if (vecm[i] < vecb[i]) { mark = i; break; } } if ((i == m) && (vecm[m - 1] == vecb[m - 1])) { break; }// 结束 } } else { vecm[mark]++; mark--; for (i = 0; i <= mark; i++) { vecm[i] = i; vecb[i] = i; } vecb[mark] = vecm[mark + 1] - 1; output(); } } function output(){ var ct = new Array(); for (i = 0; i < vecm.length; i++) { ct.push(vec[vecm[i]]); } result.push(ct); } return result; } |
|
返回顶楼 | |
发表时间:2008-12-19
全冠清 写道 再出一基础题,写一正则表达式,要求匹配这样这的格式:
1,是三个数字 2,这三个数字有两个是相同的,另一个不相同 如:112,565,889都能匹配,但123,666不能匹配。 放答案 ((\d)((?!\2)\d)\3)|((\d)\5((?!\5)\d))|((\d)((?!\8)\d)\8) |
|
返回顶楼 | |