2015-12-09 6 views
1

Это мой рекурсивный код, который я написал для вычисления НОД:НОД в JS - Максимальный стек вызовов превысил

function gcd(n1, n2) { 
    if(n1<n2) { 
     return gcd(n1, n2-n1); 
    } 
    else if(n2<n1) { 
     return gcd(n1-n2,n2); 
    } 
    else{ 
     return n1; 
    } 
} 
console.log(gcd(process.argv[2], process.argv[3])); 

Это дает мне ошибку Range. Любая идея почему? :(

EDIT:.

Я удалил стандартный ввод и заменить его случайными числами, и она работала отлично

Интересно, почему он не работает в первый раз, хотя ...

+0

Что такое process.argv? – Rishav

+1

Пожалуйста, прочитайте [ask]. Обратите особое внимание на MCVE – Amit

+2

Предполагая, что это приложение Node, что такое * точная * командная строка, используемая для его запуска? –

ответ

0

Попробуйте следующее:

function gcd(n1, n2) { 
    if(n1<n2) { 
     return gcd(n1, n2-n1); 
    } 
    else if(n2<n1) { 
     return gcd(n1-n2,n2); 
    } 
    else{ 
     return n1; 
    } 
} 
console.log(gcd(parseInt(process.argv[2]), parseInt(process.argv[3]))); 

Я думаю, что принуждение типа JavaScript вызывает получение. С исходной версией я могу заставить его переполнять ошибку переполнения вызова следующим образом:

node gcd.js 3 11 
+0

Да, вы были правы. Благодаря! –

+0

Ницца, переполнение стека, разрешенное в stackoverflow! – davejagoda

0

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