在JavaScript中以指定长度打印钻石的代码

时间:2019-10-10 19:45:27

标签: javascript iteration

因此,我目前正在学习JavaScript,并且我对人们可以在编程中完成工作的许多不同方式感兴趣。这是我的钻石代码,可以使用给定的奇数:

const l = 11;
let space = ' '; 
let star = '*';
let i = 1;
let k;
let n = 0;

while(i <= l) {
  k = (l - i)/2;
  console.log(space.repeat(k) + star.repeat(i));
  i = i + 2;
}

// i = i - 2;

while(i >= 2) {
  i = i - 2;
  k = (l - i)/2;
  if(i < l) {                       // To get rid of repeating middle line
    console.log(space.repeat(k) + star.repeat(i));
  } else { 
    continue; 
    }
}

还有其他更直观的方法吗?

5 个答案:

答案 0 :(得分:3)

您可以采用递归方法并调用该函数,直到获得最长的星形为止。

function diamond(l, i = 1) {
    const
        STAR = '*',
        SPACE = ' ',
        LINE = SPACE.repeat((l - i) / 2) + STAR.repeat(i);

    console.log(LINE);
    if (i >= l) return;
    diamond(l, i + 2);
    console.log(LINE);
}

diamond(11);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

迭代方法

如果您想使用迭代方法来解决此问题,则可以执行以下操作:

const makeDiamond = n => {
   let total = n, iter = 0
   const base = ['*'.repeat(n)] // Start with the middle, build out
   while((n-=2) > 0) {
      const layer = ' '.repeat(++iter)+'*'.repeat(n)
      base.unshift(layer) // Prepend layer
      base.push(layer)    // Append layer
   }
   base.forEach(l => console.log(l)) // Print each layer in sequence
}

注意:这适用于偶数或奇数大小的钻石。

答案 2 :(得分:1)

创建一个函数以创建第n行。
通过创建一个等于高度一半的数组来创建顶部,并使用line函数将其映射。
加入顶部,然后反转顶部并将其用作底部。

var diamond=n=>(n=Array(Math.round(n/2)).fill().map((v,i)=>" ".repeat((n-i*2+1)/2)+"*".repeat(i*2+1))).join`\n`+'\n'+n.reverse().slice(1).join('\n');

答案 3 :(得分:1)

reduce

const n = 11;
Array.from(Array(~-n/2|0), (_,i) => " ".repeat(i+1) + "*".repeat(n+~i*2))
  .reduce((a, c) => [c, ...a, c], ["*".repeat(n)])
  .forEach(l=>console.log(l))

~-n/2|0 === Math.floor((n-1)/2)

n+~i*2 === n-(i+1)*2

答案 4 :(得分:0)

我实际上设法创建了另一个类似的代码,该代码使i = i + 2保持运行,而不是在第二个循环中减小它。

const l = 11;
let space = ' '; 
let star = '*';
let i = 1;
let k;
let n = 0;

while(i <= l) {
  k = (l - i)/2;
  console.log(space.repeat(k) + star.repeat(i));
  i = i + 2;
}

while(i >= l) {
  k = (i - l)/2;
  n = i - (4 * k);
  if (n > 0) {console.log(space.repeat(k) + star.repeat(n));
  } else { break; }
  i = i + 2;
}