通过单个数组递归记录javascript中所有可能的排列
Recurse through single array logging all possible permutations in javascript
例如,我有一个数组
["red", "green", "blue", "purple"]
数组中可以有任意数量的条目。使用这个数组,我想创建一个可能排列的列表,但不重复数组中的项目(无重复)
例如,上面的数组将产生
red,green,blue,purple
red,green,purple,blue
red,blue,green,purple
red,blue,purple,green
red,purple,blue,green
red,purple,green,blue
green,red,blue,purple
green,red,purple,blue
green,blue,red,purple
green,blue,purple,red
green,purple,blue,red
green,purple,red,blue
blue,red,green,purple
blue,red,purple,green
blue,green,red,purple
blue,green,purple,red
blue,purple,green,red
blue,purple,red,green
purple,red,green,blue
purple,red,purple,blue
purple,green,red,blue
purple,green,blue,red
purple,blue,green,red
purple,blue,red,green
我是一个递归新手,我还没有完全掌握如何用它来完成这个,
EDIT答案最初提到"组合",但OP寻找的技术术语是"排列";查看下面OP的评论,并了解更多关于组合、排列和变化的信息,在这里(至少有一个区别:在排列中,顺序很重要,在组合中,顺序不重要)
function combs(arr,str){
var arrCopy,popped;
for(var i =0; i<arr.length; i++){
arrCopy = arr.splice(0);
popped = arrCopy.splice(i,1)
combs(arrCopy,popped);
}
if(arr.length === 0){
console.log(str);
}
}
将所有选项记录到控制台。如果您需要以某种格式返回它们,您可以返回而不是在基本情况下打印,并在必要时将递归调用的结果连接在一起。
function allcombs(a) {
var all = [];
function combs(arr, str) {
var arrCopy, popped;
for (var i = 0; i < arr.length; i++) {
arrCopy = arr.splice(0);
popped = arrCopy.splice(i, 1)
combs(arrCopy, popped);
}
if (arr.length === 0) {
all.push(str);
console.log(str);
}
}
combs(a);
return all;
}
你可以这样开始:
http://rosettacode.org/wiki/Permutations JavaScript
它的实现是输出到HTML元素,但您应该能够轻松地调整它以满足您的需求。
接受的应答只记录长度为1的数组。如果你给它一个包含4个不同元素的数组,你期望所有的排列(它应该记录4! = 4*3*2*1 = 24
项,但它只记录3项(和第四个未定义的?))
这里,我将接受的答案改编为记录所有预期排列的东西。我在我修改的被接受的答案的特定行上留下了评论。一旦接受的答案被编辑,我会删除我的反对票。你看,我的答案和另一个关于排列的SO答案是一致的。这里可以看到JSFiddle
function allcombs(a) {
var all = [];
var permuteCount = 0;
function combs(arr, str) {
permuteCount++;
var arrCopy, popped, str = str || []; // initialize str
console.error(arr.length);
for (var i = 0; i < arr.length; i++) {
arrCopy = arr.slice(0); // need to slice (copies values out of arr), not splice (moves values out and *empties* arr; affecting the *if* check at the end of this function
popped = arrCopy.splice(i, 1)
combs(arrCopy, str.concat(popped)); // <- need to concatenate to accumulate results
}
if (arr.length === 0) {
all.push(str);
console.log(str);
}
}
combs(a);
console.error(permuteCount);
return all;
}
var result = JSON.stringify(allcombs(["red", "green", "blue", "purple"]), null, 4).replace(/],/g, '],<br/>');
// document.body.innerHTML = result;
console.log('final result ', result);
相关文章:
- 有可能过滤来自嵌入式YouTube的声音吗
- Livereload for node.js.有可能吗
- 有可能在来自链接的警报中有一个值吗
- 有可能通过sessionID获得快速会话吗
- 正在对已提取的文档进行填充.有可能吗?如果有,怎么做
- 有可能得到一个大整数实例的自然日志吗
- Ajax与jQuery同步.有可能吗
- 如何使一个Math.random数组元素比另一个数组元素更有可能被选中
- 有可能隐藏同行吗;强制转向/继电器时相互IP
- 如何使用javascript从同一浏览器下的其他页面获取URL?有可能吗
- JavaScript在变量中存储操作?有可能吗
- 我有可能防止黑客使用网络控制台用JavaScript重复调用upvote(AJAX)函数吗
- 有可能过滤extjs图表吗
- 有可能将SYSTEMJS与REQUIREJS结合起来吗
- 有可能让两个变量指向同一个对象吗?(javascript)
- 这有可能对网站进行按键模拟吗
- 如何保存iframe(scrollto)的x和y?有可能吗
- Asp.net按钮事件点击不做回发.有可能吗
- 有可能对对象中的所有键进行原子更新吗?类似于阵列拼接的东西
- 有可能在Chrome扩展中使用ES6吗