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