Maison > Questions et réponses > le corps du texte
JavaScript中,使用for循环输出如下图形(等腰三角形,和平行四边形)?原理是啥?
最近在学习for循环,但是数学不是很好,老师说和数学没有太大关系,但是我实在想不出来,求教各位了;
1;只是使用for循环,(最多使用2次)最多使用4个变量,并且改一个变量就可以更改行数。
代码:
for(var a=0,b="";a<5;a++){
b+="*";
console.log(b);
}
输出为:
*
**
***
****
*****
倘若我要输出:
***** *****
***** *****
***** *****
***** *****
***** *****
如果是反方向的,该怎么想?
* *******
*** *****
***** ***
******* *
等腰三角形,如果是倒立的,规律是怎样的?如果是等边三角形,又是怎样的?只能用for循环,
看看我的想法和大家的是否一致,希望大家帮帮我这个初学js的小生。祝大家假期愉快~~~!!!
天蓬老师2017-04-11 13:13:59
这个和语言没有太大关系,所以和JS无关
这个其实是思维方面的,一般完完全全从0到学编程,都会遇到这样的问题,这样的问题虽然简单,但其实就是看你能不能将问题转化为程序的思维
说回这个问题就是:你怎么看待星号和空格
第一个就是星号每次都在递增,这是和循环变量a挂钩的
后面两个是,星号都是5个,空格在递增,空格数和a挂钩
最后两个是空格和星号都和a挂钩
PS:如果很久都还没转过弯来,是该考虑自己是否适合编程,话比较糙。。。
伊谢尔伦2017-04-11 13:13:59
这也是我刚接触编程的时候做过的,刚开始的时候也是没想通。其实多想想就可以了。他的解法很多。
说一个我的解法吧。首先用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+=" "; //表示左边空格的变化,依次递增一个
}
上面就是我这个菜鸟的一个解题思路。
巴扎黑2017-04-11 13:13:59
*****
*****
*****
*****
*****
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));
}
PHP中文网2017-04-11 13:13:59
以下代码用了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);
}
}