js中實現楊輝三角

Grubber發表於2018-09-15

實現效果:楊輝三角

即:

 提示使用者輸入要實現的楊輝三角行數:


請輸入楊輝三角的行數:
8


程式碼實現後的效果如下:
       1
      1.1
     1.2.1
    1.3.3.1
   1.4.6.4.1
  1.5.10.10.5.1
 1.6.15.20.15.6.1
1.7.21.35.35.21.7.1 

  

  在這裡我將用到js中陣列的知識來完成,我將用二維陣列來儲存這個序列,其中外層陣列儲存所有的值,裡層陣列將儲存每一行的值。

  我的思路是:

    1.獲取使用者輸入要的行數。

    2.建立二維陣列並進行計算,優先計算出所需要的數值,並按行儲存,輸出之後效果如下:

      1
      1 1
      1 2 1
      1 3 3 1
      1 4 6 4 1

    3.對以上的資料,按照楊輝三角的要求進行調整格式,即在每行數字的前面增加相應的空格。

     

方法中的難點如下: 

  1.建立陣列

  眾所周知,js中建立的陣列為一維陣列,但是我要用二維陣列才能完成,那麼就要用到js中的建構函式建立陣列的方法建立一個偽二維陣列,程式碼如下:

    let arr = [];   //建立一維陣列(用作外層,儲存所有資料)
    for(let i=0;i<lineCount;i++){   //lineCount 為變數,用於儲存使用者輸入的行數
        arr[i]=new Array(i+1);   //對每行建立一個長度為i+1的陣列,用於儲存每行的資料
    }

  以上程式碼中,二維陣列長度給了i+1,實際上對應了楊輝三角的行數和當前行的數字數量相同的特徵,給了長度,方便後面直接對其賦值。若不給長度,後面就要用push的方法增加,但是我不建議這樣做,如果用push增加資料進去,會造成增加的資料不便於後期計算(親測試驗過的,感興趣的小夥伴也可以自己實踐體會下)。

  2.按照規律進行計算,楊輝三角的規律為:除了每行的第一個數和最後一個數為1外,中間的數為上一行的對應的兩個數相加的和。

for (let i = 0; i < lineCount; i++) {
    // 計算每個值裝進陣列中
    for (let j = 0; j <= i; j++) {
        if (j == 0 || j == i) {    //每行第1個和最後1個值為1
            arr[i][j] = 1;
        } else {
            arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];    //計算和值,本行的值是上1行對應列的數與其前一個數相加的結果
        }
    }
}

  3.新增空格。每行的空格數為 lineCount- i – 1個,並輸出

for (let i = 0; i < lineCount; i++) {
// 新增空格
nbsp = “;
for (let j = 0; j < lineCount – i – 1; j++) {
nbsp += ` `;
}
console.log(nbsp+arr[i])
}

 

完整的程式碼如下:

let readline = require(`readline-sync`);
console.log(`請輸入楊輝三角的行數:`);
let line = ~~readline.question(``);
// 1.先將楊輝三角做成如下形式
            //  1
            //  1 1
            //  1 2 1
            //  1 3 3 1
            //  1 4 6 4 1
     // 2.新增空格
// arr儲存所有的資料
let arr = [],nbsp = ``;
// 建立二維陣列,每行作為1個陣列儲存
for (let i = 0; i < line; i++) {
    arr[i] = new Array(i + 1);
}
for (let i = 0; i < line; i++) {
    // 計算每個值裝進陣列中
    for (let j = 0; j <= i; j++) {
        if (j == 0 || j == i) {
            arr[i][j] = 1;
        } else {
            arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
        }
    }
}
for (let i = 0; i < line; i++) {
    // 新增空格 
    nbsp = ``;
    for (let j = 0; j < line - i - 1; j++) {
        nbsp += ` `;
    }
    console.log(nbsp+arr[i])
}

  

實際上這樣實現還存在一個問題,當要輸出的行過多的情況下,就會出現三角形逐漸偏斜的情況如下,影響美觀。我暫未想到辦法解決,若有興趣的小夥伴想到辦法可以留言探討。

請輸入楊輝三角的行數:
15


              1
             1.1
            1.2.1
           1.3.3.1
          1.4.6.4.1
         1.5.10.10.5.1
        1.6.15.20.15.6.1
       1.7.21.35.35.21.7.1
      1.8.28.56.70.56.28.8.1
     1.9.36.84.126.126.84.36.9.1
    1.10.45.120.210.252.210.120.45.10.1
   1.11.55.165.330.462.462.330.165.55.11.1
  1.12.66.220.495.792.924.792.495.220.66.12.1
 1.13.78.286.715.1287.1716.1716.1287.715.286.78.13.1
1.14.91.364.1001.2002.3003.3432.3003.2002.1001.364.91.14.1

  

相關文章