Javascript程序在所有浏览器中永远运行
Javascript program running for ever in all browser
我有下面的代码来生成给定数字的排列。问题是,如果我试图生成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>
你的递归会把所有的东西都放在堆栈上。您要么需要以某种方式使其尾部递归(从循环中删除递归调用并以某种方式将其移动到函数的末尾),要么将所有递归调用推到您自己的堆栈中,这样您至少可以让函数死亡。所有这些都假设浏览器足够聪明,可以检测到它是尾递归的,所以祝你好运。
相关文章:
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- 使用压缩的JavaScript文件(不是运行时压缩)
- While循环在JavaScript中永远运行
- 动态弹出窗口'通过调用一个永远运行并返回's每个周期后的数据
- 如何在不停止的情况下永远运行node-js
- “流星运行安卓设备”需要永远安装Cordova插件
- 运行节点.js永远的脚本
- Javascript-Can'我不能让我的程序运行——循环永远不会结束
- 永远运行sail.js+angularjs项目得到未知提供者:a
- 如何永远运行流星?使用第三方数据库效果好吗
- 如何创建一个RxJS缓冲区,将NodeJS中的元素分组,但不依赖于永远运行的间隔
- Jquery上的Promise回调在空响应时永远不会运行
- jQuery ready函数不工作,它永远不会运行
- Node.js永远停止在同一机器上运行的其他服务
- 关闭一个不会永远运行的脚本中的Mongoose连接
- 使用超测运行Mocha测试时,Express路由永远不会执行
- 永远运行一个Node.js Angular.js Gulp.js应用
- 如何确保php脚本永远不会运行两次
- Javascript程序在所有浏览器中永远运行
- offlineAudioContext.在iOS上运行startRendering()后,oncomplete永远不会触