實現效果:楊輝三角
即:
提示使用者輸入要實現的楊輝三角行數: 請輸入楊輝三角的行數: 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