如何使用JavaScript打印基本圣诞树?

时间:2018-10-10 16:17:53

标签: javascript loops data-structures tree

尝试创建一个简单的脚本,该脚本在控制台中使用简单的JS循环绘制一定高度的树。看起来应该是这样。

对于高度= 4:

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

到目前为止有这个功能,但不知怎么做:

function drawTree(height) {
    for ( var i = 0; i < height ; i++ ) {
        var star = '*';
        var space = ' ';

        for ( var j = 1; j <= i; j++ ) {
            star = star + '***';            
        }

        for ( var k = height - 1 ; k > 0; k-- ) {            
            spacesBefore = space.repeat(k);
            star = spacesBefore + star;
        }
        console.log(star);
    }
}

var levels = prompt('How many levels high should be the tree?');

drawTree(levels);
alert('Check console') 

我错了什么建议吗? thx <3

2 个答案:

答案 0 :(得分:1)

您的代码有2个小问题。

  1. 每个级别应该有奇数个星星(1、3、5、7,...),并且您要添加3n + 1颗星,它们将在偶数和奇数之间交替。为此所做的更改是star = star + "**"而不是... + "***"
  2. 不需要for (var k = ...)循环来计算空格。您的逻辑是正确的,但是在每一行的整个高度上循环将为您提供每行相同数量的空格,这就是您的输出所显示的,这是错误的。对于空格数,您要执行的操作是height - i - 1

有效的解决方案如下所示:

function drawTree(height) {
    for ( var i = 0; i < height ; i++ ) {
        var star = '*';
        var space = ' ';

        for ( var j = 1; j <= i; j++ ) {
            star = star + '**';            
        }
           
        var spacesBefore = space.repeat(height-i-1);
        star = spacesBefore + star;
        console.log(star);
    }
}

var levels = prompt('How many levels high should be the tree?');

drawTree(levels);

此代码的更简洁版本如下所示:

function drawTree(height) {
  for (var i = 0; i < height; i++) {
    // 2n+1 stars per row i.e. 1, 3, 5, 7, ...
    var stars = '*'.repeat(2 * i + 1);
    var spacesBefore = ' '.repeat(height - i - 1);
    console.log(spacesBefore + stars);
  }
}

drawTree(prompt('How many levels high should be the tree?'));

答案 1 :(得分:0)

想先计算宽度,然后再使用该宽度。空格取决于每个高度中*的宽度和数量。

width = height*2 - 1;

树的代码:

function tree(h) {

    let i =0, j = 1;

    w = h*2 - 1;

    let space = parseInt(w / 2);

    while (space >= 0) {
        let str = '';

        for (i = 0; i < space; i++) str += ' ';

        for (i = 0; i<j; i++) str += '*';

        console.log(str);

        // Since every next line got 2 more *
        j += 2;
        // Number of space reduce by 1
        space--;
    }
}