基礎的猜數字 ,會把猜過的數字又重複猜到,為了提升效率,把猜數字 1~100,在10次內猜完。
運算思維
假設1-10中答案為7。
第1回: 猜5 (以二元搜尋法取中間值,   可確認有一半的範圍是不需要的! )
| round | guess | next range | 
|---|---|---|
| 1 | 5 | 6 ~ 10 | 
| 2 | 8 | 6 ~ 7 | 
| 3 | 6 | 7 | 
| 4 | 7 | - | 
拆解-辨識模式
| round | guess | next range | min | max | compare | 
|---|---|---|---|---|---|
| 0 | - | 1 ~ 10 | 1 | 10 | - | 
| 1 | 5 | 6 ~ 10 | 6 (guess+1) | 10 | < 7 | 
| 2 | 8 | 6 ~ 7 | 6 | 7 (guess-1) | > 7 | 
| 3 | 6 | 7 | 7 | 7 | =7 | 
| 4 | 7 | - | - | - | - | 
辨識模式說明
- 設定最大值最小值
 - 猜最大最小值中間的數字
 - 若猜的數字比答案小,把min改成猜的數字+1
 - 若猜的數字比答案大,把max改成猜的數字-1
 - 重複2 ~ 4步驟,直到猜到為止。
 
flowchart


pseudocode
答案為隨機值
設定 guess = 0
設定 min = 1
設定 max = 100
設定 count = 0 //回合數
WHILE guess !== answer
    count += 1
    guess = Math.floor((min + max) / 2)
    IF guess > answer
        max = guess - 1
    ELSE IF guess < answer
        min = guess + 1
    ELSE
        答對
    END IF
END WHILE
coding

L14 L15 let min = 1 和let max = 10 不是寫在While loop內,這樣每新的回合都被重新宣告。所以移到文件最上方。
L16 L17 猜中間數字 2種寫法
guess = Math.floor((min + max)/2)
guess = Math.floor((max - min) / 2) + min
L22 L26
 max = guess-1 和min = guess+1 若沒有賦值-1或+1(調整上下限)仍可以跑程式,且可在10次內猜完。
 但是,如果答案為100時,猜99 ->  太小  ->  回合加1 ->  guess = Math.floor((99 + 100)/2) = 99  -> 無限迴圈。
 


