如何还原简单的JavaScript循环?

如何还原简单的JavaScript循环?,javascript,loops,for-loop,Javascript,Loops,For Loop,我正在学习JavaScript的基础知识。我尝试编写一个程序,将以下方案记录到控制台: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 我成功地通过代码获得了任务的前半部分: var x = 5; var line; for(var i = 0; i<x; i=i+1){ line = ""; for(var j=0; j<x; j=j+1){

我正在学习JavaScript的基础知识。我尝试编写一个程序,将以下方案记录到控制台:

*
* *
* * *
* * * *
* * * * *
* * * * *
* * * *
* * *
* *
*
我成功地通过代码获得了任务的前半部分:

 var x = 5;
    var line;

    for(var i = 0; i<x; i=i+1){
        line = "";
        for(var j=0; j<x; j=j+1){
            if(j <= i){
                line = line + " * ";
            }
        }
    console.log(line);
    }

有谁能给我一个提示,怎样才能得到这个计划的第二部分?我想使用另一个循环,就像我现在使用的循环一样,但要还原它的动作,这样每行中的星星就会越来越少。

很多解决方案都是可能的,但最简单的,就像你建议的,就是还原循环。;循环语句应该是这样的:

 for(var i = x-1 ; i>=0 ; i--)

基本上,您必须更改for循环条件,该条件将从最大值开始向后,这是第一个语句部分,称为
初始值设定项

循环必须在
0
处停止/中断,语句的第二部分称为
test
(直到循环满足此条件,它将在下一次迭代中继续)

语句的最后一部分是迭代更新(在下一个循环中状态应该如何改变)


也就是说,改变陈述你应该能够保持你的身体不变:

var x=5;
对于(变量i=x-1;i>=0;i--){
第“”行;
对于(var j=0;jif(j作为一种可能的解决方案,您可以在循环中放入另一个
if
子句(仔细阅读):

如果行索引达到金字塔的一半(最大行长度),则开始打印
maximumLineLength*2-索引-1

这将在达到一半后本质上改变循环的行为,因此启动次数将开始减少而不是增加


另一种解决方案是,如果要在字符串中保留星号,可以将它们相加,直到达到
maxLineLength
,然后减去它们,直到返回0(可以使用布尔标志)


为了避免破坏解决方案,我不会发布实际代码。

提示:您需要在for循环中减小I和j,并转动
扰流板:
使用while循环怎么样

var count = 0,
    i = 1,
    addition = 1,
    str = null;
while (i) {
    str = new Array(i+1).join('*');
    console.log(str);
    if (i === 5) {
        console.log(str);
        addition = -1;
    }
    i += addition;
}

有两个for循环,一个接一个。第一个添加星星,第二个删除星星:

var line = "";
for (var i = 0; i < 5; i += 1) {
    line += "*";
    console.log(line);
}
for(var j = 5; j > 0; j -= 1) {
    line = line.replace(line[j], "");
    console.log(line);
}
var-line=”“;
对于(变量i=0;i<5;i+=1){
行+=“*”;
控制台日志(行);
}
对于(变量j=5;j>0;j-=1){
行=行。替换(行[j],“”);
控制台日志(行);
}

这是反模式的;为什么要这样

然而-累积变量:

var x=5,
Y
行,,
结果=[];
而(x-){
y=5-x;
行=“”;
而(y--){
直线=直线+“*”;
}
结果:推(线);
}
document.write(result.join(“
”); 文件。写(“
”);
document.write(result.reverse().join(“
”);
我认为带条件的解决方案和带两个循环的解决方案是您应该使用的解决方案,但您可以直接使用一点模运算来计算星号数:

var x = 5;
var line;
for(var i = 1;i < x * 2;i++){
  line = '';
  for(var j = 0;j < Math.abs( (i+3) % 8 - 4) + 1;j++){
    line = line + ' * ';
  }
  console.log(line);
}
var x=5;
var线;
对于(变量i=1;i
我使用了一个技巧,在这里很可能会被认为有点脏,但它是有效的。我在这里使用的顺序是1,2,3,4,5,4,3,2,为了得到最后一个1,我只需再运行一次

一般而言: 要获得从1到x再回到1的序列(x>1),运行外循环x*2次,使用
Math.abs((i+(x-2))%(2*x-2)-(x-1))+1
作为内循环的上限,其中i从1到2x-1


证明留作学生练习。

使用递减值(从5到0)进行第二次循环你的问题不在于循环技术,而是你必须以不同的方式处理
。你需要将
设置为空字符串,而不是将其设置为类似
***
,然后在每一轮上删除一颗星。如果循环中增加或减少
i
,只要loop在正确的循环次数后停止。为什么要反转循环?您可以在构建第一个部分的同时构建第二个部分:嗯……我认为您不需要使用这种方法来减少
j
,至少在我尝试的代码中不需要这样做。(当然,由于我们只是在抛出提示,我们的实现可能会有所不同。)“这样就不需要将多个循环嵌套在一起".uhhh…你在while循环中嵌套了for循环?EDIT:Grr,鬼鬼祟祟的编辑…因此,我删除了该部分,因为我试图删除内部循环,但没有使用未来的技术(如字符串克隆)就找不到像样的解决方案。瞧,我作弊了,并找到了一种在while中创建字符串而不显式循环的方法。还有别的吗?@Gle如果
n
循环的避免会破坏可读性,那么我就不会太担心这些循环了。
var x = 5;
var line;
for(var i = 1;i < x * 2;i++){
  line = '';
  for(var j = 0;j < Math.abs( (i+3) % 8 - 4) + 1;j++){
    line = line + ' * ';
  }
  console.log(line);
}