Javascript 查找没有重复的数字的所有排列(为清晰起见进行了编辑)
我已经完成了来自Coderbyte的挑战,但并不优雅: 让函数PrimeChecker(num)获取num并返回1(如果有) num的排列结果是一个素数,否则返回0。 例如:如果num是910,那么输出应该是1,因为910可以是 排列成109或019,两者都是素数 我的解决方案是生成num参数中所有可能的数字排列的数组,然后扫描其中的素数:Javascript 查找没有重复的数字的所有排列(为清晰起见进行了编辑),javascript,arrays,recursion,duplicates,Javascript,Arrays,Recursion,Duplicates,我已经完成了来自Coderbyte的挑战,但并不优雅: 让函数PrimeChecker(num)获取num并返回1(如果有) num的排列结果是一个素数,否则返回0。 例如:如果num是910,那么输出应该是1,因为910可以是 排列成109或019,两者都是素数 我的解决方案是生成num参数中所有可能的数字排列的数组,然后扫描其中的素数: function PrimeChecker(num) { // Accounting for 1 not being a prime number
function PrimeChecker(num) {
// Accounting for 1 not being a prime number by definition
if (num == 1) {
return 0;
}
// Defining an empty array into which all permutations of num will be put
var resultsArray = [];
// Breaking num into an array of single-character strings
var unchangedArray = num.toString().split('');
// Function to push all permutations of num into resultsArray using recursion
function getAllCombos (array, count) {
if (count === num.toString().length) {
return;
}
else {
for (var i = 0; i < array.length; i++) {
var temp = array[count];
array[count] = array[i];
array[i] = temp;
resultsArray.push(array.join(''));
}
return getAllCombos(array, count+1) || getAllCombos(unchangedArray, count+1);
}
}
getAllCombos(unchangedArray, 0);
// Converting the results from strings to numbers and checking for primes
var numArr = [];
resultsArray.forEach(function(val, indx) {
return numArr[indx] = Number(val);
});
for (var i = 0; i < numArr.length; i++) {
var prime = 1;
for (var j = 2; j < numArr[i]; j++) {
if (numArr[i] % j == 0) {
prime = 0;
}
}
if (prime == 1) {
return prime;
}
}
return 0;
}
函数PrimeChecker(num){
//说明1在定义上不是质数
如果(num==1){
返回0;
}
//定义一个空数组,将num的所有排列放入其中
var结果数组=[];
//将num分解为单个字符串数组
var unchangedArray=num.toString().split(“”);
//函数使用递归将num的所有排列推送到resultsArray中
函数getAllCombos(数组、计数){
if(count==num.toString().length){
返回;
}
否则{
对于(var i=0;i
问题是我正在生成的num参数的排列数组中充满了重复项。。我觉得这样做可以更有效率
例如,当只需要6个条目时,运行PrimeChecker(123)会产生20个条目的排列数组
有人知道如何更有效地执行此操作吗?我会这样做:
var permute=(函数(){
返回排列;
函数排列(列表){
返回列表。长度?
list.reduce(置换,[]):
[[]];
}
函数置换(置换、项、索引、列表){
返回置换。concat(置换(
list.slice(0,索引).concat(
list.slice(索引+1)))
.地图(concat,[项目]);
}
函数concat(列表){
返回此.concat(列表);
}
}());
函数isPrime(n){
对于(var i=2,m=Math.sqrt(n);我可以在这里找到一些生成数组置换的高效而优雅的解决方案:谢谢你,我将有一个我喜欢的外观我的初学者的大脑能够理解它!一些想法:1)我在PrimeChecker()中注意到您已经将基数值定义为10..这有必要吗?2)我很困惑,直到我弄清楚permute被定义为匿名且立即执行(?)返回一个内部定义的同名函数的函数。这是标准约定吗,将变量分配给与其中定义的函数同名的函数?3)在isPrime()中,我喜欢通过Math.sqrt(n)限制循环的方式!非常聪明,节省了大量处理时间。@Manningham是的,这是必要的,原因如下:不,这不是一个标准惯例。这是我自己的个人惯例。我这样做的原因是因为permutate
和concat
函数仅由permute
函数使用。因此,没有理由不使用它们应该对其他函数可见。因此,我创建了一个。非常感谢!晚饭后我将继续深入讨论这个问题。