簡體   English   中英

Javascript-查找素數列表的代碼保持凍結

[英]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;
};

工作示例: https : //jsfiddle.net/daCrosby/wfgq28no/

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM