AmitabhaGhosh123 Ответов: 2

Как читать и отображать данные из командной строки в javascript и nodejs


Привет,

Мне нужно считывать данные из STDIN и отображать их в STDOUT с помощью javascript + nodejs.

Ниже приведены формулировки проблемы .

1. выведите сумму чисел с помощью рекурсии от 1 до числа, введенного в командной строке.
Пример : если я введу 5 в командной строке, то он должен вывести сумму как 15.( 1 + 2 + 3 + 4 + 5)

2. Покажите квадрат только положительных действительных чисел в массиве.
Пример : если я введу [-7,2.5,3,4] в командной строке, то я должен получить [9,16];

Что я уже пробовал:

Для задачи 1 я написал следующий код .

var n = process.argv[2];
recurSum(Н);

recurSum(Н)

{
если(n == 1)
console.log(1);
console.log(n + recurSum(n - 1));
}

Но он выдает ошибку "максимальный размер стека вызовов превышен".


Для задачи 2 я хочу знать , как я могу прочитать данные из массива, который вводится в командной строке с помощью javascript.

Richard MacCutchan

Я не думаю, что Javascript может читать с консоли, так как он обычно работает в браузере. Возможно, существует какая-то тестовая структура, которая это позволяет.

2 Ответов

Рейтинг:
12

Richard MacCutchan

Это потому, что ваша рекурсия никогда не заканчивается. Вам необходимо добавить следующие изменения:

recurSum(n)
{
    if (n > 0) // do nothing if n is less than 1
    {
        if(n == 1)
            console.log(1);
        else // only recurse if n is greater than 1
            console.log(n + recurSum(n - 1));
    }
}


[редактировать]
Приведенный выше код имеет простой недостаток. Ниже приводится правильная реализация:
function recurSum(n) {
    if (n > 0) { // do nothing if n is less than 1
        if (n == 1) {
            return 1; // console.log(1);
        }
        else { // only recurse if n is greater than 1
            return n + recurSum(n - 1);
        }
    }
}

[/редактировать]


AmitabhaGhosh123

привет,

когда я ввожу 1 в командной строке , я получаю сумму как 1, что является правильным.
Но когда я ввожу 2 или любое другое число , я получаю нижеприведенный вывод.
1
2undefined

Это не тот правильный вывод, который требуется .

Желаемый результат : он должен вывести сумму от 1 до числа, введенного в консоль.

Richard MacCutchan

Это происходит потому, что функция не возвращает свое вычисленное значение. Se мой обновленный код выше.

AmitabhaGhosh123

вышеприведенное решение не работает, когда in заменяет возврат на console.log.
Это дает мне нижеприведенный результат
3
3undefined.

Richard MacCutchan

Почему вы изменили код, чтобы он перестал работать? Рекурсивная функция должен имейте возвращаемое значение для того, чтобы правильно писать. Вы должны переместить свои команды consol.log в точку после вызова функции.

answer = recurSum(value);
console.log(answer);

AmitabhaGhosh123

я беру ввод из командной строки.
я вызываю эту функцию следующим образом.
recurSum(process.argv[2]), где process.argv[2] - это номер, заданный в командной строке.

AmitabhaGhosh123

сейчас он работает , но не суммирует ценности.
если я ввожу 2 , он печатает 21 вместо 3.

то есть нижеприведенная строка объединяет значения, а не возвращает сумму.
return (n + recurSum(n - 1)).

Richard MacCutchan

Пожалуйста, используйте Улучшить вопрос ссылка выше, и показать код, который вы сейчас используете. Код, который я опубликовал, работает правильно, и я понятия не имею, что вы изменили.

AmitabhaGhosh123

На самом деле я беру входные данные из STDIN, поэтому мне пришлось изменить их на число, прежде чем отправлять их в функцию recurSum. Теперь он работает правильно.

AmitabhaGhosh123

Еще один вопрос .

Предположим, я ввожу в терминальный узел <filename> [2,3,4]

У вас есть какие-нибудь идеи, как превратить это в массив?

Richard MacCutchan

Вам нужно будет создать массив, а затем добавить элементы один за другим, используя метод push. Javascript на самом деле не предназначен для работы в среде консольного типа, поэтому он становится довольно сложным.

Рейтинг:
0

Dave Kreskowiak

Каждая рекурсивная функция нуждается в способе "спасения". Какой-то способ определить, что он больше не должен называть себя.

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

Правильно сделайте отступ в вашем коде, и это стало бы очевидным. Ваш if оператор выводит только 1 в журнал консоли, когда n == 1. Перед повторным вызовом функции нет выхода из нее.

recurSum(n)
{
    if(n == 1)
        console.log(1);

    // See something wrong here?
    console.log(n + recurSum(n - 1));
}


AmitabhaGhosh123

Привет,

Не могли бы вы также ответить на мой 2-й вопрос?

Dave Kreskowiak

Нет. Я вообще не очень много занимаюсь javascript.

Но вы можете поискать в Google "javascript read command line arguments" и "javascript parse string into array".

AmitabhaGhosh123

не могли бы вы помочь мне исправить код ?

Dave Kreskowiak

Нет. Я не буду делать за тебя домашнее задание.

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