嵌套循环返回限制

时间:2018-11-10 18:15:54

标签: javascript function loops

我正在为在线课程进行测验。

  

对于本测验,您将创建一个名为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 :(得分:3)

因为您在makeLine中有一个循环,该循环从1到length(包括1)循环,并且在添加到行时使用+=。因此,每次调用line时,"* "将被length添加makeLine次。


侧面说明:完全没有理由拥有makeLine功能。但是,如果要使用它,请不要在for中声明它。过去是无效的(尽管在某些情况下浏览器JavaScript引擎可以接受)。它不再无效,但这里没有充分的理由。

旁注2:您的代码成为我所谓的The Horror of Implicit Globals的牺牲品。您需要声明h(和i)变量。

答案 1 :(得分:1)

问题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!解决了该问题,它现在应该可以按预期运行!

答案 2 :(得分:0)

内部循环条件和外部循环条件都将根据length(它是10)进行检查,因此每次内部循环运行时您将获得10 * s。要获得预期的结果,您可以将ih进行比较,而不是length

此外,在循环的每次迭代中重新声明函数也是一个坏主意。

答案 3 :(得分:0)

您的makeline内部函数不应将length作为参数,因为length是三角形的最大宽度。相反,makeline必须使用确切的宽度在该实例上进行打印。在这种情况下,您的h。否则,您的makeline将在末尾打印length*length行。

相关问题