Предел возврата вложенного цикла - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю над викториной для онлайн-курса.

Для этого теста вы создадите функцию buildTriangle (), которая будет принимать входные данные (треугольник с самой широкой шириной) и будет возвращать строковое представление треугольника. Смотрите пример выходных данных ниже.

buildTriangle(10);

returns
* 
* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 
* * * * * * * * 
* * * * * * * * * 
* * * * * * * * * * 

Я решил это с помощью этой функции:

function buildTriangle(length) {
    var line = "";
    var triangle ="";
    for (h = 1; h <= length; h++) {
        makeLine(length);
        function makeLine(length) {line += "* ";}
        triangle += line + "\n";
    }
    return triangle
}

buildTriangle(10));

Который успешно возвращает:

* 
* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 
* * * * * * * * 
* * * * * * * * * 
* * * * * * * * * *

Однако, прежде чем перейти к этому решению, я попробовал это:

function buildTriangle(length) {
    var line = "";
    var triangle ="";
    for (h = 1; h <= length; h++) {
        makeLine(length);
        function makeLine(length) {
            for (i = 1; i <= length; i++) {
                line += "* ";
            }
        }
        triangle += line + "\n" 
    }
    return triangle
}

console.log(buildTriangle(10));

Который вернул это:

* * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

Почему эта вложенная функция makeLine не проходит цикл нормально (т.е. начиная с 1), а вместо этого выдает 10 каждый раз? Есть ли способ заставить цикл работать нормально (1, 2, 3, 4, 5 ...)? Почему это вложение не работает?

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018

Ваша внутренняя функция makeline не должна принимать length в качестве параметра, поскольку length является самым широким с треугольником. Вместо этого makeline должен использовать точную ширину для печати в этом случае. И в этом случае ваш h. В противном случае ваш makeline напечатает length*length строк в конце.

0 голосов
/ 10 ноября 2018

выпуск 1

Первая проблема с вашей второй функцией заключается в том, что вы передаете length в makeLine вместо h:

function buildTriangle(length) {
    var line = "";
    var triangle ="";
    for (h = 1; h <= length; h++) {
        makeLine(h);
        function makeLine(length) {
            for (i = 1; i <= length; i++) {
                line += "* ";
            }
        }
        triangle += line + "\n" 
    }
    return triangle
}

console.log(buildTriangle(10));

Выпуск 2

Далее вы заметите, что треугольник добавляет h больше, чем нужно. Это потому, что у вас есть line для конкатенации, а не после каждого запуска:

function buildTriangle(length) {
    var line = "";
    var triangle ="";
    for (h = 1; h <= length; h++) {
        makeLine(h);
        function makeLine(length) {
            line = "";
            for (i = 1; i <= length; i++) {
                line += "* ";
            }
        }
        triangle += line + "\n" 
    }
    return triangle
}

console.log(buildTriangle(10));

Presto! Исправлена ​​проблема, и теперь она должна работать как положено!

0 голосов
/ 10 ноября 2018

Условия внутреннего и внешнего цикла сравниваются с length, что равно 10, поэтому вы получаете 10 * с при каждом запуске внутреннего цикла. Чтобы получить ожидаемый результат, вы можете сравнить i с h вместо length.

Кроме того, плохая идея переопределять функцию внутри каждой итерации цикла.

0 голосов
/ 10 ноября 2018

Поскольку у вас есть цикл в makeLine, который повторяется от 1 до length (включительно), и вы используете += при добавлении в строку. Таким образом, line будет добавлено "* " к нему length раз, каждый раз, когда вы звоните makeLine.


Примечание: нет никакой причины вообще иметь функцию makeLine. Но если вы собираетесь иметь это, не объявляйте это в for. Раньше это было недопустимо (хотя в некоторых случаях браузерные движки JavaScript допускали это). Он больше не является недействительным, но здесь нет веской причины.

Примечание 2: Ваш код становится жертвой того, что я называю Ужас неявных глобалов . Вам необходимо объявить переменные hi).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...