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

Javascript program running for ever in all browser

本文关键字:永远 运行 浏览器 程序 Javascript      更新时间:2023-09-26

我有下面的代码来生成给定数字的排列。问题是,如果我试图生成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>

您的主要问题是您不断地操作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>

你的递归会把所有的东西都放在堆栈上。您要么需要以某种方式使其尾部递归(从循环中删除递归调用并以某种方式将其移动到函数的末尾),要么将所有递归调用推到您自己的堆栈中,这样您至少可以让函数死亡。所有这些都假设浏览器足够聪明,可以检测到它是尾递归的,所以祝你好运。