2011-04-29 44 views
0

我有下面的代码来生成给定数字的排列。问题是如果我尝试产生5位数以上的排列然后它永远运行。如何优化此程序以在浏览器中显示结果。在所有浏览器中永远运行的Javascript程序

<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> 

回答

1

您的主要问题是您经常操纵昂贵的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> 
+0

+1为您的解决方案。但为什么要8?我试图产生n位数字 – Soft 2011-04-29 01:13:28

+0

那么,@ user393001提出的递归肯定没有帮助。而且,在这个长度上,这些数字开始变得巨大。有n!长度为n的排列,因此在8处有40320个8位数的数字,您正在生成并添加到页面中。在9,你有362880,等等...... – 2011-04-29 01:19:13

0

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

+0

我想知道的是,它是给我即时结果,而我通过JAVA运行。但它在浏览器中不工作 – Soft 2011-04-29 00:48:52

+0

Java完全不同的Java管理堆,并且有可能正在为您调整它的JVM。 Java也可以分配更多的内存来处理,所以你不会在相同数量的调用中遇到资源问题(我怀疑这是问题)。 – Blue 2011-04-29 00:54:45

相关问题