Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找没有重复的数字的所有排列(为清晰起见进行了编辑)_Javascript_Arrays_Recursion_Duplicates - Fatal编程技术网

Javascript 查找没有重复的数字的所有排列(为清晰起见进行了编辑)

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

我已经完成了来自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 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
函数使用。因此,没有理由不使用它们应该对其他函数可见。因此,我创建了一个。非常感谢!晚饭后我将继续深入讨论这个问题。