【问题标题】:create triangle numbers pattern javascript and verticaly snake number pattern square创建三角形数字图案 javascript 和垂直蛇形数字图案正方形
【发布时间】:2021-09-15 13:43:10
【问题描述】:

我想创建三角形数字模式

let segitigaPola3 = num => {
  let hasil = ''
  for (let i = 1; i <= num; i++) {
    for(let j = 0; j < i; j++) {
      hasil += `${i} `
    }
    
    hasil += ` \n`
  }
  return hasil
}

console.log(segitigaPola3(5))
console.log()
console.log()

当前输出是:

1
2 2
3 3 3
4 4 4 4
5 5 5 5 5

我想要的是类似的东西 对于三角形:

1
2 3
4 5 4
3 2 1 2
3 4 5 4 3

对于正方形:

1 10 11 20 21
2 9  12 19 22
3 8  13 18 23
4 7  14 17 24
5 6  15 16 25

我怎样才能做到这一点? 感谢您的任何建议:)

【问题讨论】:

  • 方阵背后的逻辑是什么?有代码吗?

标签: javascript for-loop numbers


【解决方案1】:

对于三角形,这种模式有4个条件:

  1. 当数量增加时:

    • 如果当前数字与num 相同 ==> 是时候将流量转为减少了
    • 否则,请保持原样。
  2. 当数量减少时:

    • 如果当前数字达到 1 ==> 是时候将流量转为增加了
    • 否则,请保持原样。

在下面这段代码中,我使用nowbefore来跟踪当前流程/流程是增加还是减少,然后检查当前数量是否达到转折点(1或num变量) .

let segitigaPola3 = num => {
  let hasil = ''
  
  let now = 1; // Set arbitrary counter
  let before = 0;
  
  for (let i = 1; i <= num; i++) {
    for(let j = 0; j < i; j++) {
      hasil += `${now} `;
      console.log(now, before, num);
      if (now > before) { // Check if the flow is increasing
        if (now !== num) { // Check for the turning point (num)
          now++;
          before++;
        } else {
          now--;
          before++;
        }
      } else {
        if (now > 1) { // Check if the current still not reached the turning point
          now--;
          before--;
        } else {  // When the current reaches the turning point
          now++;
          before--;
        }
      }
    }
    
    hasil += ` \n`
  }
  return hasil
}

console.log(segitigaPola3(5));

对于正方形,基于列的元素有两个条件:

  1. 对于奇数列,它总是从上排到下排递增。这是查看模式的亮点:
Row no. | i ( = Col no.) | j
------------------------------
 1      | 1              | 1
 5      | 1              | 5
------------------------------
 1      | 3              | 11
 5      | 3              | 15

这总是从(i-1)*num + 1 开始并一直增加直到结束于(i*num),我们使用j 来填充元素。

  1. 对于偶数列,情况正好相反。突出显示以查看模式:
Row no. | i ( = Col no.) | j
------------------------------
 1      | 2              | 10
 2      | 2              | 9
------------------------------
 1      | 4              | 20
 2      | 4              | 19

根据上面的模式,它总是从i*num 开始,一直增加直到(i-1)*num + 1 结束,我们使用j 来填充元素。

function squareMaker(num) {
  let result = '';
  let arr = [];
  for (let i = 1; i <= num; i++){
    let temp = [];
    
    // Generating the odd column elements
    if (i % 2 != 0) {
      for (let j = (i-1)*num + 1; j <= i*num; j++) { 
        temp.push(j);
      }
    } 
    
    // Generating the even column elements
    else {
      for (let j = i*num; j > (i-1)*num ; j--) {
        temp.push(j);
      }    
    }
    arr.push(temp);
  }
  
  // Generating the result string.
  for (let i = 0; i < num; i++){
    for (let j = 0; j < num; j++) {
      result += `${arr[j][i]} `;
    }
    result += '\n';
  }
  return result;
}

console.log(squareMaker(5));

【讨论】:

    【解决方案2】:

    对于三角形图案,您可以使用@depperm 的函数。垂直的方形蛇纹有点棘手:

    function triangle(count) {
      var result = "";
      var x = 1;
      var add = true;
      for (var i = 1; i <= count; i++) {
        for(var j = 0; j < i; j++) {
          result += x + " ";
          add ? x += 1 : x -= 1;
          if(x === count || (x === 1 && !add)) add =! add;
        }
        
        result += " \n";
      }
      return result;
    }
    
    
    function square(count) {
        var result = "";
        var rows = [];
        for (var i = 0; i < count; i++) {
            if (i == 0) {
                var row = [0];
                for (var j = 0; j < count; j++) {
                    var num = (j + 1) % 2 == 0 ? (j + 1) * count : row[j] + 1; 
                    row.push(num);
                }
                row.shift();
            } else {
                var row = [];
                for (var j = 0; j < count; j++) {
                    var num = (j + 1) % 2 == 0 ? (rows[i - 1][j] - 1) : (rows[i - 1][j] + 1);
                    row.push(num);
                }
            }
            rows.push(row); 
            result += row.join(" ") + "\n";
        }
        return result;
    }
    
    console.log(triangle(5));
    console.log(square(5));

    【讨论】:

      【解决方案3】:

      对于三角形,我将为输出数字 (x) 创建一个单独的变量,并为它是否应该加减创建一个标志。

      let segitigaPola3 = num => {
        let hasil = ''
        let x=1;
        let add=true;
        for (let i = 1; i <= num; i++) {
          for(let j = 0; j < i; j++) {
            hasil += `${x} `
            add?x+=1:x-=1;
            if(x===num || (x===1 && !add)) add=!add
          }
          
          hasil += ` \n`
        }
        return hasil
      }
      
      console.log(segitigaPola3(5))

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2018-01-05
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        相关资源
        最近更新 更多