Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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_Performance_Browser - Fatal编程技术网

Javascript程序在所有浏览器中永远运行

Javascript程序在所有浏览器中永远运行,javascript,performance,browser,Javascript,Performance,Browser,我有下面的代码来生成给定数字的排列。问题是,如果我试图生成5位数以上的排列,那么它将永远运行。如何优化该程序以使结果显示在浏览器中 <html> <script> function permute(level, permuted, used, original) { var length = original.length; if (level == length) { //System.out.println(permuted)

我有下面的代码来生成给定数字的排列。问题是,如果我试图生成5位数以上的排列,那么它将永远运行。如何优化该程序以使结果显示在浏览器中

<html>
<script>



function permute(level,  permuted, used,  original) {
    var length = original.length;
    if (level == length) {
        //System.out.println(permuted);
        document.getElementById("nmbrs").innerHTML = document.getElementById("nmbrs").innerHTML + "<br />" +permuted
    } else {
            for (var i = 0; i < length; i++) {
                if (!used[i]) {
                    used[i] = true;
                    permute(level + 1, permuted + original[i],
                       used, original);
                    used[i] = false;
                }
            }
        }
    }



function executeP(){
    var s = ['0','1','2','7'];
    document.getElementById("nmbrs").innerHTML = "";
    var length = eval(document.getElementById("num").value);

    /*for(var i=length-1;i>=0;i--){
        var used = [false, false, false, false];
        permute(i, "", used, s);
    }*/

    var newArray = ['0','1','2','7'];
    if(length > 4){

        var newIte = length - 4;
        do{
            newArray.push(s[(newIte-1) % 4]);
            newIte--;
        }while(newIte>0);
    }

    var used = [false, false, false, false,false, false, false, false,false, false, false, false];
    permute(newArray.length-length, "", used, newArray);

}


</script>
<body>
<input type="text" id="num" />
<input type="button" value="Generate Num" onclick="executeP()" />

<div id="nmbrs" ></div>
</body>
</html>

功能置换(级别、置换、使用、原始){
变量长度=原始长度;
如果(级别==长度){
//System.out.println(已置换);
document.getElementById(“nmbrs”).innerHTML=document.getElementById(“nmbrs”).innerHTML+“
”+已置换 }否则{ 对于(变量i=0;i=0;i--){ 使用的变量=[假,假,假,假]; 排列(i,“,使用,s); }*/ var newArray=['0','1','2','7']; 如果(长度>4){ var newIte=长度-4; 做{ newArray.push(s[(newIte-1)%4]); 纽特--; }而(newIte>0); } 使用的var=[假,假,假,假,假,假,假,假,假,假,假,假,假]; 排列(newArray.length-length,“,已使用,newArray); }
您的递归将保留堆栈上的所有内容。您要么需要以某种方式使其尾部递归(从循环中删除递归调用并以某种方式将其移动到函数的末尾),要么将所有递归调用推送到您自己的堆栈中,这样您至少可以让函数消亡。所有这些都假设浏览器足够智能,可以检测到它也是尾部递归的,所以IE的好运。

你的主要问题是你一直在操作DOM,这很昂贵。相反,将结果存储在临时位置,然后生成要使用的HTML,然后将其附加到DOM中

这是你的页面/脚本的一个修改版本,显示了我的意思,并且很容易生成长度为8+的排列

<html>
<script>
var results = [];

function permute(level, permuted, used, original) {
    var length = original.length;
    if (level == length) {
        results.push(permuted);
    } else {
            for (var i = 0; i < length; i++) {
                if (!used[i]) {
                    used[i] = true;
                    permute(level + 1, permuted + original[i],
                       used, original);
                    used[i] = false;
                }
            }
    }
}

function executeP(){
    var s = ['0','1','2','7'];
    document.getElementById("nmbrs").innerHTML = "";
    var length = eval(document.getElementById("num").value);

    var newArray = ['0','1','2','7'];
    if(length > 4) {

        var newIte = length - 4;
        do {
            newArray.push(s[(newIte-1) % 4]);
            newIte--;
        } while (newIte>0);
    }

    var used = [false, false, false, false,false, false, false, false,false, false, false, false];
    permute(newArray.length-length, "", used, newArray);
    var resultHtml = "";
    var resultLength = results.length;
    for (var i = 0; i < resultLength; i++) {
        resultHtml += results[i];
        resultHtml += "<br/>";
    }
    document.getElementById("nmbrs").innerHTML = resultHtml;
}

</script>
<body>
<input type="text" id="num" />
<input type="button" value="Generate Num" onclick="executeP()" />
<div id="nmbrs" ></div>
</body>
</html>

var结果=[];
功能置换(级别、置换、使用、原始){
变量长度=原始长度;
如果(级别==长度){
结果:推送(置换);
}否则{
对于(变量i=0;i4){
var newIte=长度-4;
做{
newArray.push(s[(newIte-1)%4]);
纽特--;
}而(newIte>0);
}
使用的var=[假,假,假,假,假,假,假,假,假,假,假,假,假];
排列(newArray.length-length,“,已使用,newArray);
var resultHtml=“”;
var resultLength=results.length;
对于(var i=0;i”;
}
document.getElementById(“nmbrs”).innerHTML=resultHtml;
}

我想知道的是,当我运行JAVA时,它会立即产生结果。但它在browserJava中不起作用Java以完全不同的方式管理堆,并拥有JVM,JVM可能正在为您进行调优。Java还可以分配更多的内存,这样您就不会在相同的调用量下遇到资源问题(我怀疑这就是问题所在)。但是为什么要到8点呢?我试图生成n digitWell,@user393001带来的递归肯定没有帮助。而且,在这段时间里,数字开始变得巨大。有n个!长度为n的排列,因此在8时,您将生成40320个8位数字并添加到页面中。在9点,你有362880,等等。。。