0%

JS 筆記 - 函式填空法

puzzle

什麼是函式填空法?

也就是在撰寫一個功能的時候,如果發現有一個地方不會寫,那就用 function 把它填起來,然後先確保整體架構是對的,那只要專心把 function 內的程式碼寫正確,那應該就可以正確執行,也可以避免初心者殺手:雙層迴圈。菜雞如我就是之前看到二維陣列的雙層迴圈時,就瞬間傻住不知道該怎麼解…

判斷 1-10 質數

直接來看一個題目,找出 1~10 中的質數,質數的定義可以看一下維基百科。

小時候數學真的是爛…

題目需求可以改成這樣:

  1. 找出 1~10 的數字
  2. 找出質數。

虛擬碼可以寫成

由題意可以寫成虛擬碼,看起來結構應該是對的。

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) {
//todo
}

有發現問題被簡化了,變得容易理解了!
再來就把 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. 質數的定義有寫到 1 被定義為不是質數,所以先判斷如果 num === 1,就回傳 false。
  2. 從 2 開始跑迴圈,如果 num 除以 迴圈的數字為整除,就不是質數。
  3. 不然就是質數。

提醒:
新手容易犯錯的地方有可能會寫成下方這樣。

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

參考資料

  1. 先別急著寫 leetcode