[英]Javascript - Code for finding a list of prime numbers keeps freezing
在研究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凍結的原因。 無論如何,有沒有讓我的問題持續足夠長的時間給我答案?
你可以試試看。
var is_prime = function(n) {
if (n == 1) {
return true;
}
if (n == 2) {
return true;
}
for (var i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
var list_of_primes = function(n) {
var list2 = [];
for (var i = 2; i < n; i++) {
if (is_prime(i)) {
list2.push(i);
}
}
return list2;
}
confirm(list_of_primes(1000))
在不到幾秒鍾的時間內即可正常工作。 https://jsfiddle.net/LL85rxv5/
質數(或素數)是大於1的自然數,除1及其本身外沒有除數。
嚴格來說,1不是質數,因此請確保在代碼中進行更新。
不太確定為什么您的代碼會超時,這有點麻煩,並且具有不必要的數組( list1
)。 無論如何,這是一段相當短的代碼版本,帶有從2到n
的質數列表。 對於較大的數字集,這不太有效,因為它會逐個檢查每個數字。
var list_of_primes = function(n) {
var list = [];
for (i = 2; i < n; i++) {
if (is_prime(i)) {
list.push(i);
}
}
return list;
}
function is_prime(i) {
for (var c = 2; c <= Math.sqrt(i); ++c)
if (i % c === 0)
return false;
return true;
}
如果您想提高效率,請查看Eratosthenes篩網 ,它可以處理更大的集:
// Credit: http://stackoverflow.com/a/15471749/1265817
var eratosthenes = function(n) {
// Eratosthenes algorithm to find all primes under n
var array = [], upperLimit = Math.sqrt(n), output = [];
// Make an array from 2 to (n - 1)
for (var i = 0; i < n; i++) {
array.push(true);
}
// Remove multiples of primes starting from 2, 3, 5,...
for (var i = 2; i <= upperLimit; i++) {
if (array[i]) {
for (var j = i * i; j < n; j += i) {
array[j] = false;
}
}
}
// All array[i] set to true are primes
for (var i = 2; i < n; i++) {
if(array[i]) {
output.push(i);
}
}
return output;
};
i
是is_prime
函數中的全局變量,它會干擾list_of_primes
函數中使用的實例。 通過這樣聲明i
為本地人來修復...
var is_prime = function(n) {
var i; // <~~ declare i as local variable here
if (n === 1) {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.