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