JavaScript 的基礎應用,記錄一下當初解題的過程。
思考邏輯
依照層數輸出 *
輸出 *
後換行
實際程式碼
1 2 3 4 5 6 7 8 9 10 let n = 5 ; let output = '' ;for (i = 0 ; i < n; i++) { let content = '' ; for (j = 0 ; j <= i; j++) { content += '*' ; } output += content + '\n' ; } console .log(output);
內層的 for 迴圈負責輸出 *
,依照層數 n
輸出相對應的 *
數量,所以控制條件 j<=i
。
1 2 3 for (j = 0 ; j <= i; j++) { content += '*' ; }
外層 for 迴圈負責控制層數 n
,將輸出的 *
儲存並換行。
1 2 3 4 5 for (i = 0 ; i < n; i++) { let content = '' ; for (j = 0 ; j <= i; j++) {...} output += content + '\n' ; }
1 2 3 4 5 6 7 8 9 * ** *** **** ***** **** *** ** *
思考邏輯
分成上下兩部份
輸出倒立的直角三角形
實際程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let n = 5 ; let output = '' ;for (i = 0 ; i < n; i++) { let content = '' ; for (j = 0 ; j <= i; j++) { content += '*' ; } output += content + '\n' ; } for (i = n - 1 ; i > 0 ; i--) { let content = '' ; for (j = 0 ; j < i; j++) { content += '*' ; } output += content + '\n' ; } console .log(output);
這個三角形可以拆為兩個直角三角形,我們要額外處理下半部的倒立直角三角形。 內層的 for 迴圈一樣依照層數輸出相對應的 *
。
1 2 3 for (j = 0 ; j < i; j++) { content += '*' ; }
外層的 for 迴圈控制層數,從四層依序遞減為一層,所以初始值為 i = n - 1
,一樣將輸出的 *
儲存並換行。
1 2 3 4 5 for (i = n - 1 ; i > 0 ; i--) { let content = '' ; for (j = 0 ; j < i; j++) {...} output += content + '\n' ; }
利用陣列儲存
這邊另一個方法是用陣列存起來,最後用 arr.join()
的方法將陣列所有元素用 \n
串接合併成一個字串回傳。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let n = 5 ; let output = [];for (i = 0 ; i < n; i++) { let content = '' ; for (j = 0 ; j <= i; j++) { content += '*' ; } output.push(content); } for (i = n - 1 ; i > 0 ; i--) { let content = '' ; for (j = 0 ; j < i; j++) { content += '*' ; } output.push(content); } console .log(output.join('\n' ))
1 2 3 4 5 * *** ***** ******* *********
思考邏輯
需要額外輸出空格
輸出的 *
每層增加 2 個
實際程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 let n = 5 ; let output = '' ;for (i = 0 ; i < n; i++) { let content = '' ; for (j = n - 1 ; j > i; j--) { content += ' ' ; } for (k = 1 ; k <= 2 * i + 1 ; k++) { content += '*' ; } output += content + '\n' ; } console .log(output);
輸出的空格從第一層 4 格依序遞減為第五層的 0 格,初始值為層數 -1 j = n - 1
,而空格只需要輸出到第四層而已,所以判斷條件為 j > i
。
1 2 3 for (j = n - 1 ; j > i; j--) { content += ' ' ; }
輸出的 *
從第一層 1 個接著每層多增加 2 個,初始值為 k = 1
,判斷條件 k <= 2 * i + 1
。
1 2 3 for (k = 1 ; k <= 2 * i + 1 ; k++) { content += '*' ; }
1 2 3 4 5 6 7 8 9 * *** ***** ******* ********* ******* ***** *** *
思考邏輯
分成上下兩部份
輸出倒立的等腰三角形
實際程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 let n = 5 ; let output = '' ;for (i = 0 ; i < n; i++) { let content = '' ; for (j = n - 1 ; j > i; j--) { content += ' ' ; } for (k = 1 ; k <= 2 * i + 1 ; k++) { content += '*' ; } output += content + '\n' ; } for (i = n - 1 ; i > 0 ; i--) { let content = '' ; for (j = n - 1 ; j >= i; j--) { content += ' ' ; } for (k = 1 ; k <= 2 * i - 1 ; k++) { content += '*' ; } output += content + '\n' ; } console .log(output);
菱形可以拆分為兩個等腰三角形,用正立的等腰三角形的概念來處理下半部的等腰三角形。
外圍層數的 for 迴圈從四層開始,依序遞減為一層,初始值為 i = n - 1
,判斷條件i > 0
。
1 for (i = n - 1 ; i > 0 ; i--) {...}
輸出的空格反過來從第一層 1 格依序增加為第四層的 4 格,初始值為 j = n - 1
,判斷條件 j >= i
。
1 2 3 for (j = n - 1 ; j >= i; j--) { content += ' ' ; }
輸出的 *
反過來,初始值一樣為 k = 1
,判斷條件則變成 k <= 2 * i - 1
。
1 2 3 for (k = 1 ; k <= 2 * i - 1 ; k++) { content += '*' ; }