我正在为在线课程进行测验。
对于本测验,您将创建一个名为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 ...)?为什么此嵌套无效?
答案 0 :(得分:3)
因为您在makeLine
中有一个循环,该循环从1到length
(包括1)循环,并且在添加到行时使用+=
。因此,每次调用line
时,"* "
将被length
添加makeLine
次。
侧面说明:完全没有理由拥有makeLine
功能。但是,如果要使用它,请不要在for
中声明它。过去是无效的(尽管在某些情况下浏览器JavaScript引擎可以接受)。它不再无效,但这里没有充分的理由。
旁注2:您的代码成为我所谓的The Horror of Implicit Globals的牺牲品。您需要声明h
(和i
)变量。
答案 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));
接下来,您会注意到三角形添加的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。要获得预期的结果,您可以将i
与h
进行比较,而不是length
。
此外,在循环的每次迭代中重新声明函数也是一个坏主意。
答案 3 :(得分:0)
您的makeline
内部函数不应将length
作为参数,因为length
是三角形的最大宽度。相反,makeline
必须使用确切的宽度在该实例上进行打印。在这种情况下,您的h
。否则,您的makeline将在末尾打印length*length
行。