JavaScript中,使用for循环输出如下图形(等腰三角形,和平行四边形)?原理是啥?

Naturally
  • 36

JavaScript中,使用for循环输出如下图形(等腰三角形,和平行四边形)?原理是啥?
最近在学习for循环,但是数学不是很好,老师说和数学没有太大关系,但是我实在想不出来,求教各位了;

1;只是使用for循环,(最多使用2次)最多使用4个变量,并且改一个变量就可以更改行数。
代码:

for(var a=0,b="";a<5;a++){
    b+="*";
    console.log(b);
}

输出为:

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

倘若我要输出:

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

如果是反方向的,该怎么想?

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

等腰三角形,如果是倒立的,规律是怎样的?如果是等边三角形,又是怎样的?只能用for循环,
看看我的想法和大家的是否一致,希望大家帮帮我这个初学js的小生。祝大家假期愉快~~~!!!

回复
阅读 6.1k
5 个回答

这个和语言没有太大关系,所以和JS无关

这个其实是思维方面的,一般完完全全从0到学编程,都会遇到这样的问题,这样的问题虽然简单,但其实就是看你能不能将问题转化为程序的思维

说回这个问题就是:你怎么看待星号和空格

第一个就是星号每次都在递增,这是和循环变量a挂钩的

后面两个是,星号都是5个,空格在递增,空格数和a挂钩

最后两个是空格和星号都和a挂钩


PS:如果很久都还没转过弯来,是该考虑自己是否适合编程,话比较糙。。。

解法很多种。 无非就是在控制空格和符号的数量。 正三角就是初始值为1,逐渐增加;倒三角就是初始值为符号个数,递减。

这也是我刚接触编程的时候做过的,刚开始的时候也是没想通。其实多想想就可以了。他的解法很多。
说一个我的解法吧。首先用for()的话,肯定看他多少行,就表示循环多少次。
这种图形都是由空格和*组成的。那么就看它的组合规律,这种对称图形一般看半边就行了。
比如第一个平行四边形:他是由第一行是由0个左边空格+5个组成,最后一行是由4个左边空格+5个组成,那么等于从第一行开始左边空格1个1个往上递增。
解法:接下来设置三个变量:i(行数) j(*的个数) k(左边空格的个数)

for(var i=0,j="*****",k="";i<5;i++){//初始化,就是第一行的情况,0个左边空格,5个*
            console.log(k+j);//表示空格+*的组合
            k+=" ";         //表示左边空格的变化,一次+1
}

那么第个二四边形:他是由第一行是由左边4个空格+5个组成,最后一行是由左边0个空格+5个组成,那左边么空格就是依次递减一个。

for(var i=0,j="*****",k="    ";i<5;i++){//初始化,就是第一行的情况,4个左边空格,5个*
                console.log(k+j);//表示空格+*的组合
                k=k.slice(1);   //表示左边空格的变化,依次减一,不知道这个slice自行百度
            }

那么第一个三角形:他是由第一行是由左边3个空格+1个组成,最后一行是由0个空格+7个组成,那么规律就是左边空格就是依次递减一个,*依次递增两个。

for(var i=0,j="*",k="   ";i<4;i++){//初始化,就是第一行的情况,3个左边空格,1个*
                console.log(k+j);//表示空格+*的组合
                j+="**";        //表示*的变化,每次加两个
                k=k.slice(1);   //表示左边空格的变化,依次减一,不知道这个slice自行百度
}

那么第二个三角形:他是由第一行是由左边0个空格+7个组成,最后一行是由3个空格+1个组成,那么规律就是左边空格就是依次递增一个,*依次递减两个。

for(var i=0,j="*******",k="";i<4;i++){//初始化,就是第一行的情况,0个左边空格,7个*
                console.log(k+j);//表示空格+*的组合
                j=j.slice(2);    //表示*的变化,每次递减两个
                k+=" ";         //表示左边空格的变化,依次递增一个
}

上面就是我这个菜鸟的一个解题思路。

*****
  *****
   *****
    *****
     *****
for(var a=0,b="*****";a<z;a++){
    console.log(" ".repeat(z-a) + b);
}
     *****
    *****
   *****
  *****
 *****
for(var a=0,b="*****";a<5;a++){
    console.log(" ".repeat(5-a) + b);
}
    *
   ***
  *****
 *******
for(var a=1,b="*";a<5;a++){
    console.log(" ".repeat(5-a) + b.repeat(a) + b.repeat(a-1 > 0 ? a-1 : 0));
}
*******
 *****
  ***
   *
for(var a=4,b="*";a>0;a--){
    console.log(" ".repeat(4-a) + b.repeat(a) + b.repeat(a-1 > 0 ? a-1 : 0));
}

以下代码用了ES6,取名比较随意s就是space,空格的意思,n是要总次数,第二个参数是输出的图形
第一个很简单,累加就好了

//ES6
function first(n,print = "*"){
  for(let i = 0; i < n ;i++)
     console.log(i > 0 ? print.repeat(i + 1) : print);
}
//非ES6
function first(n,print){
  print = print || "*";
  var temp = "";
  for(var i = 0; i < n ; i++)
     console.log(temp += print);
}

第二个也很简单,依旧是累加,这次累加的是空格,如果是第一次进入循环就不打印空格

//非es6
function second(n,print){
    print = print || "*****"
    for(var i = 0,s = "";i < n;i++)
       console.log(i > 0?(s = " "  + s) + print : print);
}

关于倒过来,不用es6的话,写两个循环(也许可以不用写两个循环吧,但是我没想到),用了es6的话用repeat函数可以写的更好看点

//es6
function secondReverse(n,r = "*****"){
    for(let i = 0;i < n;i++)
       console.log(" ".repeat(n-i-1) + r );
}
//非es6
function secondReverse(n,print){
    print = print || "*****";
    for(var i = n;i > 0;i--){
       var s = "";
       for(let j = 0 ; j < i ; j++)
          s+= " ";
       console.log(s + print);
    }
}

三角形

//ES6
function third(n,print = "*"){
  for(let i = 0 ; i < n ; i++ )
     console.log(" ".repeat(n-i-1) + (i > 0 ? print.repeat(2*(i+1)-1) : print))
}
//非Es6
function third(n,print){
  print = print || "*";
  var temp = "";
  for(var i = 0 ; i < n ; i++ ){
     let s = "";
     for(var j = 1 ; j < n - i ;j++)
       s += " ";
     console.log(i > 0 ? s + (temp = temp + print + print) : s + (temp +=print));
  }
}

倒过来

//ES6
function thirdReverse(n,print = "*"){
  for(let i = n ; i > 0 ; i--)
     console.log(" ".repeat(n - i) + print.repeat(2*i-1))
}
//非ES6
function thirdReverse(n,print){
  print = print || "*";
  var s = "";
  for(var i = 0 ; i < n ; i++ ){
     let temp = "*";
     s += " ";
     for(var j = 1 ; j < n - i ;j++)
       temp += print + print
     console.log(s + temp);
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏