【发布时间】:2016-04-22 12:33:00
【问题描述】:
在处理 Project Euler 的问题 3 时,我遇到了一个问题,我似乎无法解决 javascript 一直冻结的问题。这是我的代码:
var is_prime = function(n) {
if (n === 1) {
return true;
}
if (n === 2) {
return true;
}
var list1 = []
for (i = 2; i < n; i++) {
list1.push(i);
}
for (i = 2; i < list1.length; i++) {
if (n % i === 0) {
return false;
}
}
return true;
}
var list_of_primes = function(n) {
var list1 = [];
var list2 = [];
for (i = 2; i < n; i++) {
list1.push(i);
}
for (i = 2; i < list1.length; i++) {
if (is_prime(i)) {
list2.push(i);
}
}
return list2;
}
confirm(list_of_primes(1000))
我知道我的算法不是最有效的,而且我只是在暴力破解问题,但我只是想知道我做错了什么。我很确定问题出在这段代码中的某个地方:
for (i = 2; i < list1.length; i++) {
if (is_prime(i)) {
list2.push(i);
}
}
我认为一个潜在的问题是我的算法花费的时间太长,这就是导致 javascript 冻结的原因。有没有办法让我的问题运行足够长的时间来给我答案?
【问题讨论】:
-
“我知道我的算法不是最有效的......” 是不是你在暴力破解时只是在最大化 CPU?尝试让它在一夜之间运行,看看是否有任何结果。或者在循环中包含一些 console.log() 命令以定期输出 i 的“当前”值?
-
我不认为我可以最大化我的 CPU。我设法让它在 python 上工作,答案只花了大约 1 秒。但是,当我尝试将此代码转换为 javascript 并在 jsfiddle 或 node.js 上运行时,它们都会在一秒钟内崩溃。
-
@OscarYih 你试过像 15 这样的小值吗?它肯定会更快地工作。如果它有效,则意味着您需要改用有效的算法。如果遇到任何错误,请检查浏览器上的控制台。
-
Python 在这种算法上可能比 Javascript 更有效。我已经编写了 Javascript,它在看似微不足道的输入上消耗了相当多的 CPU。这可能只是达到语言可以做的极限的情况。尝试在运行时监控您的 CPU,如果某个核心达到 100%,那么您很可能正在碰壁。特别是如果您使用 node.js 得到相同的行为(否则我会责怪目标浏览器中语言的草率实现)。
-
等一下:这可能是因为你的两个函数都使用相同的全局变量
i作为循环计数器?
标签: javascript