everycode
everycode copied to clipboard
2014年12月30日D5
/*
*返回arr的所有长度为size的子数组的组合
* 如arr = [1,2,3,4], size = 2
* return [[1,2], [1,3], [1,4], [2,3], [2,4], [3,4]]
*
* 再如arr = [1,2,3,4], size = 3
* return [[1,2,3], [1,2,4],[1,3,4] [2,3,4]];
*/
function power( arr, size) {
//TODO
}
function power(arr, size) {
var r = [];
function _(t, a, n) {
if (n === 0) {
r[r.length] = t;
return t;
}
for (var i = 0, l = a.length - n; i <= l; i++) {
var b = t.slice();
b.push(a[i]);
_(b, a.slice(i + 1), n - 1);
}
}
_([], arr, size);
return r;
}
alert(power([1,2,3,4], 2).join('\n'));
function power( arr, size ) {
var first,
subPower,
i, len,
ret = [];
if( arr.length === size ) {
return arr;
}
if( size === 1 ) {
for( i = 0, len = arr.length; i < len; i++ ) {
ret.push( [arr[i]] );
}
return ret;
}
while ( arr.length >= size ) {
if( arr.length === size ) {
ret.push( arr );
break;
} else {
first = arr.shift();
subPower = power( arr.slice(0), size - 1 );
for( i = 0, len = subPower.length; i < len; i++ ) {
subPower[i].push(first);
ret.push( subPower[i] );
}
}
}
return ret;
}
上我的答案
function power(arr, size) {
var results = [];
// 每次截取一个值
// 循环被截取的数组
// 每次生成size要求的数组,并将被截取的值放到数组的开头,并保存到集合
// 递归调用直到数组被清空为止
(function (arr) {
var current = arr.shift();
for(var i = 0; i < arr.length; i++) {
var result = arr.slice(i, i+(size-1));
result.unshift(current);
result.length === size && results.push(result);
}
if(arr.length) { arguments.callee(arr) }
})(arr);
return results;
}
// 测试用例
console.log(power([1,2,3,4], 2)); // [ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ], [ 3, 4 ] ]
console.log(power([1,2,3,4], 3)); // [ [ 1, 2, 3 ], [ 1, 3, 4 ], [ 2, 3, 4 ] ]
咦,我写的跟题目要求的结果不是一致的.. 不过不想改了.. (~﹃~)~zZ
var a=[1,2,3,4];
function u(a,i){ var result=[]; var re=[]; function pu(c,d){ var f=d.slice(); c.push(f); } function foo(b,j){ if(j>3) {;if(result.length==2){pu(re,result);}} else { result.push(b[j]); foo(b,j+1); result.pop(b[j]); foo(b,j+1); } } foo(a,i); return re } u(a,0)
想到了递归就是没想到怎么个递归法,哈哈,向1楼学习