什麼是函式填空法?
也就是在撰寫一個功能的時候,如果發現有一個地方不會寫,那就用 function 把它填起來,然後先確保整體架構是對的,那只要專心把 function 內的程式碼寫正確,那應該就可以正確執行,也可以避免初心者殺手:雙層迴圈。菜雞如我就是之前看到二維陣列的雙層迴圈時,就瞬間傻住不知道該怎麼解…
判斷 1-10 質數
直接來看一個題目,找出 1~10 中的質數,質數的定義可以看一下維基百科。
小時候數學真的是爛…
題目需求可以改成這樣:
- 找出 1~10 的數字
- 找出質數。
虛擬碼可以寫成
由題意可以寫成虛擬碼,看起來結構應該是對的。
1 2 3 4 5 6 7 8
| let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for(i from 0 to n-1) do if(arr[i]是質數) do print "質數" else print "非質數" end if end for
|
改成程式碼
1 2 3 4 5 6 7 8
| let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (let i = 0; i < arr.length; i++) { if (arr[i]是質數) { console.log(i+1,"質數"); } else { console.log(i+1,"非質數"); } }
|
加入函式
1 2 3 4 5 6 7 8 9 10 11 12 13
| let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (let i = 0; i < arr.length; i++) { if (isPrime(arr[i])) { console.log(i + 1, "質數"); } else { console.log(i + 1, "非質數"); } }
function isPrime(num) { }
|
有發現問題被簡化了,變得容易理解了!
再來就把 function 內的判斷寫好!
函式內實作
1 2 3 4 5 6 7 8 9 10 11
| function isPrime(num) { if (num === 1) { return false; } for (let i = 2; i < n; i++) { if (num % i === 0) { return false; } } return true; }
|
- 質數的定義有寫到 1 被定義為不是質數,所以先判斷如果
num === 1
,就回傳 false。
- 從 2 開始跑迴圈,如果 num 除以 迴圈的數字為整除,就不是質數。
- 不然就是質數。
提醒:
新手容易犯錯的地方有可能會寫成下方這樣。
1 2 3 4 5 6 7 8 9 10 11 12
| function isPrime(num) { if (num === 1) { return false; } for (let i = 2; i < num; i++) { if (num % i === 0) { return false; } else { return true; } } }
|
對於找質數的案例來說,這樣邏輯是錯的,因為是從 2 開始,都沒有一個數字可以整除 num 的話,num 才是質數,而不是只要不能被整除,就是質數,也就是說,只有自己可以被自己整除,才是質數。
最終完成的質數判斷程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (let i = 0; i < arr.length; i++) { if (isPrime(arr[i])) { console.log(i + 1, "質數"); } else { console.log(i + 1, "非質數"); } }
function isPrime(num) { if (num === 1) { return false; } for (let i = 2; i < num; i++) { if (num % i === 0) { return false; } } return true; }
|
Demo: https://codepen.io/hnzxewqw/pen/wvowrqJ?editors=1111
參考資料
- 先別急著寫 leetcode