【问题标题】:Code to print a diamond with a given length in JavaScript在 JavaScript 中打印具有给定长度的钻石的代码
【发布时间】:2019-10-10 19:45:27
【问题描述】:

所以我目前正在学习 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; 
    }
}

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

【问题讨论】:

    标签: javascript iteration


    【解决方案1】:

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

    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; }

    【讨论】:

      【解决方案2】:

      迭代方法

      如果您想使用迭代方法来解决这个问题,您可以这样做:

      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
      }

      注意:这适用于偶数或奇数尺寸的钻石。

      【讨论】:

        【解决方案3】:

        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】:

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

          const diamond=n=>(n=Array(~~(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");
          console.log(diamond(10))

          【讨论】:

            【解决方案5】:

            我实际上设法创建了另一个类似的代码,让 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;
            }
            

            【讨论】:

              猜你喜欢
              • 2012-07-23
              • 1970-01-01
              • 2022-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多