2015-03-16 4 views
0

Я пишу функцию, которая найдет простые множители числа. В этой функции он имеет две петли. Один для нахождения факторов, другой для нахождения основных факторов из первого цикла. Второй цикл прошел бесконечно, я не заметил нигде в цикле, который мог бы сделать его бесконечным. Где я пропустил?Почему моя петля ушла в бесконечный цикл?

function findPrimeFactors(num) 
{ 
var factors = []; 
var primeFactors = []; 
var currIndex = 0; 
var initFactorsLen; 
var currCompose; 
for (i = 1; i <= num; ++i) 
{ 
    if (num % i == 0) 
    { 
    factors.push(i); 
    } 
} 
var initFactorsLen = factors.length; 
for (i = 0; i <= initFactorsLen; ++i) 
{ 
//This is infinite loop 
    console.log("i is " + i + " and factors are " + factors); 
    currCompose = factors[i]; 
    var primeTest = isPrime(currCompose); 
    if (primeTest == true) 
    { 
    primeFactors.push(currCompose); 
    } 
} 
return primeFactors; 
} 

function isPrime(num) 
{ 
var sqrtNum = Math.sqrt(num); 
var ceiledNum = Math.ceil(sqrtNum); 
if (num == 1 || num == 0) 
{ 
    return false; 
} 
else if (num == 2) 
{ 
    return true; 
} 
else 
{ 
    for (i = 2; i <= ceiledNum; ++i) 
    { 
    if (num % i == 0 && i != num) 
    { 
    return false; 
    } 
    } 
    return true; 
} 
} 

Я также заметил, что иногда она не ушла в бесконечность, но он возвращает только один простое число, хотя он имеет 2. (Попробуйте findPrimeFactors(143))

Спасибо,

+1

Поскольку вы используете [глобальные переменные все более кода] (http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals .html), а 'isPrime' изменяет ваш счетчик циклов. – Bergi

ответ

4

Ваш i цикл переменная является глобальной, поэтому обе функции имеют одинаковые значения для i.

Initialize и объявить его var, как это:

for (var i = 0; i <= initFactorsLen; ++i) 

Альтернативой объявляя ее в операторе цикла является объявить его с другими переменными. Обратите внимание, что вы можете объявить все переменные в список разделенных запятыми, например:

var factors = [], 
    primeFactors = [], 
    currIndex = 0, 
    initFactorsLen, 
    currCompose, 
    i; 

отметить также, что вам не нужно явно проверить truthness. Этот номер:

var primeTest = isPrime(currCompose); 
if (primeTest == true) { 
    primeFactors.push(currCompose); 
} 

& hellip; эквивалентно этому:

var primeTest = isPrime(currCompose); 
if (primeTest) { 
    primeFactors.push(currCompose); 
} 

& hellip; или более просто:

if (isPrime(currCompose)) { 
    primeFactors.push(currCompose); 
} 
+0

Имеет ли (! PrimeTest) значение 'isPrime (currCompose)' return false? – Anakin

+0

Значение 'var primeTest = isPrime (currCompose);', если 'isPrime (currCompose)' false, то 'primeTest' будет false, а'! PrimeTest' будет true. –

+0

Итак,! PrimeTest вернется напротив реального значения? – Anakin

1

Я не знаком с JavaScript ... вы уверены, что ваши «я» не разделяет вашего цикла в ваших двух функций. Что произойдет, если вы используете «k» в качестве индекса в функции «isprime»?

Никогда ум, она была решена 10 минут назад

+0

Использование другой переменной глобального индекса разрешит проблему, но это лучше использовать локальные переменные только для предотвращения подобных побочных эффектов. –

+0

Я согласен с тобой – PandaBlue

Смежные вопросы