zuppachu / Joanne-s-Learning-Blog

程式導師實驗計畫第二期 之 Coding 學習紀錄。
2 stars 0 forks source link

[ JS101 ] - 練習題筆記 #4

Open zuppachu opened 6 years ago

zuppachu commented 6 years ago

練習題 Lv1-4 + 隨堂考!

緣起於 Lv1-4 的答案雖然寫出來了,但不太理解為什麼顯示出來的答案不是:

*
**
***

而是直接給三顆星?

題目+ 解答如下:

//Lv1-4:回傳 n 個 * 的函示

function star(n) {

    var answer = ''

    for (var i=1; i<=n; i++) {
    answer += '*'
  }

  return answer 
}
console.log(star(3))

我想的執行過程:

star(3)帶入function star(n)裡面,

=> var answer = ''

=> 跑for loop 
=> i=1; i<=3(true) => answer = '' + *
=> i++ => i=2; i<=3(true) => answer = *+*
=> i++ => i=3; i<=3(true) => answer = **+*

=> 回傳 answer, answer = *** 

後來老師說:

因為 「function 只會回傳一次,所以 function 回傳值永遠只會有一個答案!」

就這樣子結案!老樣子,馬的!應該早一點問的!自己查了老半天,還不如一問,又快又有效!

然後隨後來之是出乎意料的是隨堂考 TT~滿有趣的,所以決定也寫筆記下來~

題目如下:

function test(){ for(var i=1; i<=10; i++) { return i } }

console.log(test())

流程解答一:

test() 進去 function

跑 for loop => i=1, i<=10, true => return i => i=1

- 題目二
```javascript
function test(){
 return 123
 for(var i=1; i<=10; i++) {
   return i
 }
}

console.log(test())

流程解答二:

test() 帶入 function => return 123 (以下被忽略了)

console.log(test())

流程解答三:

test() 帶入 function => run for loop => i=1, i<=10 true => if 1%3, 不 === 0 => i=2, i<=10 true => if 2%3, 不 === 0 => i=3, i<=10 true => if 3%3, === 0 => return i, i=3

- 題目四
```javascript
function test(){
 for(var i=1; i<=10; i++) {
   if (i > 5 && i % 2 === 0) {
     return i
   }
 }
}

console.log(test())

流程解答四:

test() 入 function
跑 for loop
=> i=1 , i<=10 true => 跑 if (1>5, false)
=> i=2 , i<=10 true => 跑 if (2>5, false)
=> i=3 , i<=10 true => 跑 if (3>5, false)
=> i=4 , i<=10 true => 跑 if (4>5, false)
=> i=5 , i<=10 true => 跑 if (5>5, false)
=> i=6 , i<=10 true => 跑 if (6>5, true && 6%2 === 0) => return i, i=6
zuppachu commented 5 years ago

判斷式練習二 : BMI 值計算

BMI 值的計算公式為:體重 / (身高^2)。 假設體重是 70,身高是 180(1.8m),BMI 就是 70/(1.8*1.8) = 21。

現在請你寫出一個簡單的 BMI 計算器,用兩個變數代表體重跟身高,算出 BMI 之後判斷 BMI 是落在哪個範圍內並輸出相對應的字串。

體重過輕:BMI < 18.5 正常範圍:18.5 <= BMI < 24 過重:24 <= BMI < 27 輕度肥胖:27 <= BMI < 30 中度肥胖:30 <= BMI < 35 重度肥胖:35 <= BMI

var W = 55 
var h = 1.5
var BMI = W / ( (h * h) )
console.log(parseInt(BMI,10))

if ( BMI < 18.5) {
    console.log("體重過輕")
} else if ( BMI >= 18.5 && BMI < 24) {
    console.log("正常範圍")
} else if ( BMI >= 24 && BMI < 27) {
    console.log("過重")
} else if ( BMI >= 27 && BMI < 30) {
    console.log("輕度肥胖")
} else if ( BMI >= 30 && BMI < 35) {
    console.log("中度肥胖")
} else {
    console.log("重度肥胖")
}
zuppachu commented 5 years ago

Level One

(第二次練習,第一次練習和老師詳解都寫在 JS101_practice 內)

練習一:印出一到九

請你分別用 for loop 以及 while 迴圈,印出 1~9。

預期輸出: 1 2 3 4 5 6 7 8 9

for (var i=1; i< 10; i++) {
    console.log(i)
}
var i = 0
while (i<9) {
    i++
    console.log(i)
}
var i = 1
while (i<10) {
    console.log(i)
    i++
}

練習二: 寫一個能夠印出 1~n 的函式

請寫一個函式叫做 print,接收一個是數字的參數 n,並且印出 1~n。

print(1) 預期輸出:

1

print(3) 預期輸出: 1 2 3

print(9) 預期輸出: 1 2 3 4 5 6 7 8 9

function print(n){
    for(var i=1 ; i<=n; i++){
        console.log(i)
    }
}

print(9)

練習三:寫一個能夠印出 n 個 * 的函式

寫一個函式 star,接收一個參數 n,並印出 n 個 * (禁止使用內建函式 repeat)

star(1) 預期輸出:

*

star(5) 預期輸出:

*****

star(10) 預期輸出:

**********
function star(n){

    var print = "*"
    var ans = ""

    for(var i=1; i<=n; i++){
        var ans = ans + print
    }

    console.log(ans)    
}

star(5)

練習四:寫一個能回傳 n 個 * 的函式

請寫出一個叫做 star 的 function 並且接受一個參數 n,能回傳 n 個 *。

star(1) 會回傳 * star(5) 會回傳 *****

所以 console.log(star(5)) 的預期輸出是:*****

function star(n){

    var print = "*"
    var ans = ""

    for(var i=1; i<=n; i++){
        var ans = ans + print
    }

    return ans  
}
console.log(star(5))

練習五:判斷大小寫

請寫一個叫做 isUpperCase 的 functuon,並且接收一個字串,回傳這個字串的第一個字母是否為大寫。

isUpperCase("abcd") 正確回傳值:false isUpperCase("Abcd") 正確回傳值:true isUpperCase("ABCD") 正確回傳值:true isUpperCase("aBCD") 正確回傳值:false

function isUpperCase(str){
    if (str[0] >= "A" && str[0]<="Z") {
        return true
    } else {
        return false
    }
}

console.log(isUpperCase("cD"))

練習六:回傳第一個大寫字母以及它的 index [x]

請寫一個 function position,接收一個字串並回傳這個字串裡面的第一個大寫字母跟它的 index,若沒有則回傳 -1。

position("abcd") 正確回傳值:-1 position("AbcD") 正確回傳值:A 0 position("abCD") 正確回傳值:C 2

function position (str) {

    for(var i=0; i<str.length-1; i++){
        if (str[i] >= "A" && str[i]<="Z") {
            return (str[i] + " " + i)
        } 

    } 
    return -1
}

console.log(position("abcd"))
console.log(position("AbcD"))
console.log(position("abCD"))

/*
這次想到 for loop , 但沒想到 return 必須放外面的原因 
and str[i] 必須用 + 才能顯示出來
*/

練習七:回傳陣列裡面所有小於 n 的數的數量 [x]

請寫出一個函式 findSmallCount,接收一個陣列跟一個數字 n,回傳有多少個數小於 n。

findSmallCount([1, 2, 3], 2) 預期回傳值:1 findSmallCount([1, 2, 3, 4, 5], 0) 預期回傳值:0 findSmallCount([1, 2, 3, 4], 100) 預期回傳值:4

function find(arr,n){
    return arr.filter(function(el){
        return el < n
    }).length
}

console.log(find([1, 2, 3], 4))

練習八:回傳陣列裡面所有小於 n 的數的總和

請寫一個函式 findSmallerTotal,接收一個陣列以及數字 n,回傳陣列裡面所有小於 n 的數的總和。

findSmallerTotal([1, 2, 3], 3) 正確回傳值:3 findSmallerTotal([1, 2, 3], 1) 正確回傳值:0 findSmallerTotal([3, 2, 5, 8, 7], 999) 正確回傳值:25 findSmallerTotal([3, 2, 5, 8, 7], 0) 正確回傳值:0

function findSmallerTotal(arr,n){
    var sum = 0
    for(i=0; i<arr.length; i++){
        if(arr[i]<n){
            sum += arr[i]
        }
    }
    return sum
}

console.log(findSmallerTotal([1, 2, 3], 3))

練習九:回傳陣列裡面所有小於 n 的數

請寫一個函式 finaAllSmall,接收一個陣列跟一個數字 n,回傳一個裡面有所有小於 n 的數的陣列(需按照原陣列順序)。

findAllSmall([1, 2, 3], 10) 正確回傳值:[1, 2, 3]

findAllSmall([1, 2, 3], 2) 正確回傳值:[1] findAllSmall([1, 3, 5, 4, 2], 4) 正確回傳值:[1, 3, 2]

function findAllSmall(arr,n){
    var newArr = []
    for(var i=0; i<arr.length; i++){

        if(arr[i]<n){   
            newArr.push(arr[i])
        }
    }
    return newArr
}

console.log(findAllSmall([1, 2, 3], 2))
console.log(findAllSmall([1, 2, 3], 10))
console.log(findAllSmall([1, 3, 5, 4, 2], 4))

練習十:回傳陣列總和

請寫一個 function sum,接收一個陣列並回傳陣列中數字的總和。

sum([1, 2, 3]) 預期回傳值:6 sum([-1, 1, 2, -2, 3, -3]) 預期回傳值:0

function sum(arr){

    var count = 0

    for(var i=0; i<arr.length; i++){

        count = count + arr[i]
    }

    return count

}

console.log(sum([-1, 1, 2, -2, 3, -3]))
console.log(sum([1, 2, 3]))
zuppachu commented 5 years ago

Level Two

練習一:好多星星

請寫出一個 function stars,接收一個參數 n,並且按照規律印出相對應的圖案。

stars(1) 預期輸出:
*
stars(3) 預期輸出:
*
**
***
stars(7) 預期輸出:
*
**
***
****
*****
******
*******
function stars(n){

    var ans = ""
    for(var i=0; i<n; i++){
        ans = ans + "*"
        console.log(ans)
    }
}

stars(7)
//老師的解法一:

印出1顆星
...
印出n顆星

function printStar(n) {
    var result = ''
    for (var i=1; j<=i ; j++) {
        result += '*'
    }

    console.log(result)
}

function stars(n) {
    for (var i=1; i<=n; i++) {
    printStar(i) //印出i顆星
    }
}

//解法二:雙重迴圈

function stars(n) {

    for (var i=1; i<=n; i++) {

        var result = ''

        for (var i=1; j<=i; j++) {

            result += '*'
      }

    console.log(result)
    }
}
debugger放在流覽器上看
stars(5)

練習二:好多星星 回傳版 (X)

請寫出一個 function makeStars,接收一個參數 n,並且根據規律「回傳」字串

makeStars(1) 正確回傳值:*
makeStars(2) 正確回傳值:*\n**
makeStars(5) 正確回傳值:*\n**\n***\n****\n*****
//老師解法 一
function star(i) {
    var result = ""
    for(var j=1; j<=i; j++){
        result += '*'
    }
    return result
}

function makeStars(n) {
    var arr = []
    for(var i=1; i<=n; i++){
        arr.push(star(i))
    }

    return arr.join('\n')
}

console.log(makeStars(5))
//解法二
function star(i) {
    var result = ""
    for(var j=1; j<=i; j++){
        result += '*'
    }
    return result
}

function makeStars(n) {
    var result = ""
    for(var i=1; i<=n; i++){
        result += star(i) 

        if(i !==n){ //為了在最後一行不加空白
            result += '\n'
        }
    }
    return result
}

console.log(makeStars(5))

練習三:好多星星 加強版 (X)

請寫出一個函式 stars2,接收一個參數 n,並依照規律印出圖形。

stars2(1) 預期輸出:
*

stars2(3) 預期輸出:
*
**
***
**
*

stars2(5) 預期輸出:
*
**
***
****
*****
****
***
**
*
// 拆解2 把 star(i) 抓出來單獨寫
function star(i){
    var ans = ""
    for(var j=1; j<=i; j++){
        ans += "*"
    }

    return ans
}

// 拆解1
function stars2(n){
    for(var i=1; i<=n; i++){
        console.log(star(i))
    }

    for(var i=n-1; i>0; i--){
        console.log(star(i))
    }
}

stars2(3)

練習四:乘法表

請寫一個函式 table,接收一個數字 n,印出 n1 ~ n9 的結果。

table(1) 預期輸出:
1*1 = 1
1*2 = 2
1*3 = 3
1*4 = 4
1*5 = 5
1*6 = 6
1*7 = 7
1*8 = 8
1*9 = 9

table(7) 預期輸出:
7*1 = 1
7*2 = 14
7*3 = 21
7*4 = 28
7*5 = 35
7*6 = 42
7*7 = 49
7*8 = 56
7*9 = 63
function table(n){

    for(var j=1; j<=9; j++){
        console.log(n + '*' + j + ' = ' + n*j)
    }
}

table(2)
table(7)

練習五:九九乘法表

請寫出一個 function table9to9,並列出 11 ~ 99。

table9to9() 預期輸出:

1*1 = 1
1*2 = 2
1*3 = 3
.....
5*1 = 5
5*2 = 10
5*3 = 15
....
9*7 = 63
9*8 = 72
9*9 = 81
function table9to9(){

    for(var i=1; i<=9; i++){
        for(var j=1; j<=9; j++){
            console.log(i + '*' + j + ' = ' + i*j)
        }

    }

}
table9to9()
老師解法:

function table(n) {
    for(var i=1; i<=9; i++) {
        console.log(n + '*' + i + '=' + n*i)
    }
}

function table9to9(){
    for(var i=1; i<=9; i++) {
     table(i) //印出i*1 ~ i*9
    }
}

table9to9()

練習六:費式數列 (X)

費式數列的定義為:第 n 個數等於前兩個數的總和,因此這個數列會長的像這樣:1 1 2 3 5 8 13 21 ....

用比較數學一點的講法,就是:

fib(0) = 0 fib(1) = 1 for n >=2, fib(n) = fib(n-1) + fib(n-2)

現在,請你寫出一個 fib 的函式,回傳位在第 n 個位置的數字

fib(1) 預期回傳值:1 fib(2) 預期回傳值:1 fib(8) 預期回傳值:21

//解法一: 遞迴
function fib(n){

    if(n === 0) return 0
    if(n === 1) return 1

    return fib(n-2)+fib(n-1)
    /*遞迴(Recursive):一直不斷回頭呼叫自己
    其中最重要:有個終止條件,像 return */    
}

console.log(fib(3))

//解法二:迴圈
function fib(n){
    var fib = [0,1]
    for(var i=2; i<=n; i++){
        fib[i] = fib[i-1] + fib[i-2]
    }
    return fib[n]
}

console.log(fib(8))

練習七:字串反轉

請寫出一個函式 reverse,接收一個字串,並且回傳反轉過後的字串。(禁止使用內建函式 reverse)

reverse("abcd") 預期回傳值:dcba reverse("12345aa") 預期回傳值:aa54321

function reverse(str){

    var ans = ""

    for(var i=str.length-1; i>=0; i--){
        ans += str[i]
    }
    console.log(ans)
}

reverse("abcd")
reverse("12345aa") 
//方法二:.reverse() for array
function reverse(str){

    var splitStr = str.split('')

    var reverseArr = splitStr.reverse()

    var joinArr = reverseArr.join('')

    return joinArr //要放在function內
}

console.log(reverse("abcd"))
console.log(reverse("12345aa"))

//方法三:上面簡化寫法
function reverse(str) {
    return str.split('').reverse().join('')
}

console.log(reverse("zxcvb"))
console.log(reverse("qwer123"))

//方法四:spread syntax (ES6) + reverse() method for arrays
function reverse(str){
    return [...str].reverse().join('');
}
console.log(reverse("zxcvb"))
console.log(reverse("qwer123"))

//方法五:reduce() method for arrays
function reverse(str){
  return str.split("").reduce((rev, char)=> char + rev, ''); 
}
console.log(reverse("abcd"))
console.log(reverse("12345aa"))

//方法六:recursion
function reverse(str){
 if(str === ""){
  return str 
 }else{
  return reverse(str.substr(1)) + str[0]
 }
}
console.log(reverse("abcd"))
console.log(reverse("12345aa"))

練習八:大小寫互換

請寫一個函式 swap,接收一個字串,並且回傳大小寫互換後的字串。

swap("Peter") 預期回傳值:pETER swap("AbCdE") 預期回傳值:aBcDe

function swap(str){

    var ans = ""

    for(var i=0; i<str.length; i++){

        if(str[i] >= "A" && str[i] <= "Z") 
            ans += str[i].toLowerCase()

        if(str[i] >= "a" && str[i] <= "z") 
            ans += str[i].toUpperCase()
    }
return ans

}

console.log(swap("Peter"))
console.log(swap("AbCdE"))
function swap(str){

    var ans = ''

    for(var i=0; i<str.length; i++) {
    if(str[i] >= 'A' && str[i] <= 'Z') {
        ans += str[i].toLowerCase()

   }else if(str[i] >= 'a' && str[i] <= 'z') {
        ans += str[i].toUpperCase()

   }else {
        ans += str[i]
        //如果是符號,就保持原樣
   }
  }
    return ans
}

console.log(swap("Peter"))
console.log(swap("AbCdE"))

//或是寫成這樣,因為 .toLowerCase() 會忽略 數字和符號!

function swap(str){

    var ans = ''

    for(var i=0; i<str.length; i++) {
        if(str[i] >= 'A' && str[i]<= 'Z') {
            ans += str[i].toLowerCase()

   }else {
        ans += str[i].toUpperCase()

  }
    return ans
}

console.log(swap("Peter"))
console.log(swap("AbCdE"))

//或是這樣 
function swap(str) {
    // spilt() 把字串轉陣列 
    return str.split('').map(function(char) {
        if (char>= 'A' && char <= 'Z'){
            return char.toLowerCase()
        } //這邊不寫 else 是因為不需要,因為只有兩個執行結果,如果不是大寫,就會跳到第二個return去
        return char.toUpperCase()
    }).join('') // join()把陣列變成字串
}
console.log(swap('!!!Peter'))

//三元運算子
function swap(str) {
    return str.split('').map(function(char) {
        return (char >= 'a' && char <= 'z')? char.toUpperCase(): char.toLowerCase()
}).join('')
console.log(swap('!!!Peter'))

練習九:找出最小值 (X)

請寫出一個函式 findMin,接收一個陣列並回傳陣列中的最小值。(禁止使用內建函式 sort)

findMin([1, 2, 5, 6, 99, 4, 5]) 預期回傳值:1 findMin([1, 6, 0, 33, 44, 88, -10]) 預期回傳值:-10

//解法一
function findMin(arr){
    return Math.min.apply(null,arr)
    //來源:https://www.jstips.co/en/javascript/calculate-the-max-min-value-from-an-array/
}
//老師的解法一 (看不太懂)
function isSmallest(arr, number){
    return arr.filter(function(item)  {
        return item < number
    }).length === 0
}// 判斷長度是否為零,如果是的話他就是 arr 內最小的數

function findMin (arr) {
    for (var i=0; i<arr.length; i++) {
        //這個數字數不是陣列裡面最小的?
        if (isSmalleset(arr, arr[i])) {
            return arr[i]
        }
    }
}
console.log(findMin([1, 2, 5, 6, 99, 4, 5]))

//老師解法二:先假設找到的最小值,把它存起來 (這比較簡單的解法)
function findMin(arr) {
    var min = arr[0]
    for (var i=0; i<arr.length; i++){
        if (min > arr[i]) {
            min = arr[i]  //如果min不是最小值,改等於arr[i] 因為這比較小
        }
    }
    return min
}

console.log(findMin([1, 2, 5, 6, 99, 4, 5]))
//方法一:利用內建函式 Math.min()
//注意:Math.min() and Math.max() 對數字陣列是無效的。
function findMin(arr){
    //先設定一個值為基準
    var result = arr[0]
    //用古早方法跑迴圈,一個一個跑出答案
    for (var i=1; i<arr.length; i++){
        //用 Math.min 比較兩個值的大小
        result = Math.min(result, arr[i]) 
    }
    return result
}

console.log(findMin([1, 2, 5, 6, 99, 4, 5]))

//方法二:利用產開運算子
function findMin(arr){
    console.log(Math.min(...arr))
}

findMin([1, 6, 0, 33, 44, 88, -10])

//方法三:內建 sort函式
function findMin(arr){
    arr.sort(function(a,b) {
        //找最小值(最大值則是b-a)
        return a-b
    })
console.log(arr[0])
}

findMin([1, 2, 5, 6, 99, 4, 5])
findMin([1, 6, 0, 33, 44, 88, -10])

/* 來源:
http://www.jstips.co/zh_tw/javascript/calculate-the-max-min-value-from-an-array/

https://alanli7991.github.io/2016/09/01/JavaScript%E6%B1%82%E6%9C%80%E5%A4%A7%E5%80%BC%E5%92%8C%E6%9C%80%E5%B0%8F%E5%80%BC/

https://tw.saowen.com/a/7cc832974e4b5808477a0fffb45115bd25d45a60af84a1f6bda1916b327bd5d6
*/

練習十:找出第 n 小的值 (X)

這題是上一題的加強版,上一題只要你找出最小值,而這一題請你寫一個 function findNthMin,接收一個陣列以及一個數字 n,找出第 n 小的數字。(禁止使用內建函式 sort)

提示:假設我要找出第 2 小的值,我只要先找出最小的值然後再把它刪掉,再重新找一次最小的值,就會是第 2 小的值了。

findNthMin([1, 2, 3, 4, 5], 1) 預期回傳值:1 findNthMin([1, 3, 5, 7, 9], 3) 預期回傳值:5 findNthMin([1, 1, 1, 1, 1], 2) 預期回傳值:1

//先找到最小值
function findMin(arr){
    var min = arr[0]
    var minIndex = 0
    for(var i=1; i<arr.length; i++){
        if(min > arr[i]){
            minIndex = i
        }
    }
    return minIndex 

}

//再找第 n 小的值
function findNthMin(arr, nth){

    // nth-1 : 代表要刪幾次
    for(var i=1; i<=nth-1; i++){
        var minIndex = findMin(arr)
        arr.splice(minIndex, 1) // 這裡的 1 代表刪去一個數值
    }
    var realMinIndex = findMin(arr)
    return arr[realMinIndex]

}

console.log(findNthMin([1, 3, 5, 7, 9], 3))
console.log(findNthMin([1, 1, 1, 1, 1], 2))
zuppachu commented 5 years ago

Level Three

練習一:排序 (X)

請寫一個 function sort,接收一個陣列並且回傳由小到大排序後的陣列。(禁止使用內建函式 sort)

提示:如果你已經會找第 n 小的值了,試著把這個概念應用到這題上。 sort([ 6, 8, 3, 2]) 預期回傳值:[2, 3, 6, 8] sort([ 1, 2, 7 ,5]) 預期回傳值:[1, 2, 5, 7]

// 排序主要是在練習找出最小值。
function findMin(arr) {
  let min = arr[0];
  let minIndex = 0;
  for (let i = 1; i < arr.length; i += 1) {
    if (min > arr[i]) {
      min = arr[i];
      minIndex = i;
    }
  }
  return minIndex;
}

function sort(arr) {
  const ans = [];
  // eslint-disable-next-line prefer-destructuring
  const length = arr.length;
  for (let i = 0; i < length; i += 1) {
    const minIndex = findMin(arr);
    ans.push(arr[minIndex]);
    arr.splice(minIndex, 1);
  }
  return ans;
}

console.log(sort([6, 8, -11, 20, 3, 2]));
// arr.sort(),但這個用法適用 ASCII 字符順序,所以需要注意可能會有 [12,12,3,47,5] 的排法出現。
function sort(arr) {
  let ans = arr.sort();
  return ans;
}

2019/04/30 決定把心得寫出來,對自己滿失望的,已經是第二回重下鍋了,怎麼對於 js 的處理能力還是依然不夠?!越焦躁越想不出來,卡了一個早上最後還是耐不住求快的心看解答了~明知不可為還是忍不住。有一種挫敗感...

練習二:壓平陣列 (X)

(遞迴題目) 請寫出一個 function flatten,接收一個多維陣列並回傳「壓平」後的陣列。

flatten([1, 2, 3]) 預期回傳值:[1, 2, 3] flatten([1, 2, [1, 2], [1, 3], 6]) 預期回傳值:[1, 2, 1, 2, 1, 3, 6] flatten([1, [2, [3, [4]], 5], 6]) 預期回傳值:[1, 2, 3, 4, 5, 6]

//   自己的解法,跟遞迴一點關係也沒有的感覺 (?)
function flatten(arr){
    //先讓陣列變成字串
    let str = arr.join()
    let ans = []

    for(var i=0; i<str.length; i++){
        //如果字串內的字不是逗號
        if(str[i] !== ",") {
            //讓他變成數字後推進 ans[] 內
            ans.push(Number(str[i])) 
        }
    }
    return ans
}

console.log(flatten([1, 2, 3]))
console.log(flatten([1, 2, [1, 2], [1, 3], 6]))
console.log(flatten([1, [2, [3, [4]], 5], 6]))
//老師的解法
function flatten(arr){
    var result = []
    for (var i=0; i<arr.length; i++){
        //Array.isArray 判斷是不是個 array
        if (Array.isArray(arr[i])){
            var flatArr = flatten(arr[i])  //=> 壓平多層陣列
            flatArr.forEach(function(value){
                result.push(value)
            })
        } else {
            result.push(arr[i])
        }
    }
    return result
}

練習三:印出聖誕樹

請寫一個 function tree,接收一個數字 n,按照規律列印出大小為 n 的聖誕樹

(這邊編輯器有點問題空白顯示不出來,用 _ 代表空白)

tree(1) 預期輸出:
*

tree(2) 預期輸出:
_*
***
_*
_*

tree(5) 預期輸出:
____*
___***
__*****
_*******
*********
____*
____*
____*
____*
____*
//老師解法
function tree(n){

    if (n===1) return console.log('*')
    //分成兩部分設
    treeTop(n)
    treeBottom(n)

}

function treeTop(n){
    for(var i=1; i<=n; i++){
        //空白是 *n-i , '*'為 2*i-1 
        console.log(' '.repeat(n-i) + '*'.repeat(2*i-1))
    }
}

function treeBottom(n){
    for(var i=1; i<=n; i++){
        console.log(' '.repeat(n-1) + '*')
    }
}

tree(3)

練習四:判斷圈圈叉叉勝負

請寫出一個 function winner,接收一個代表圈圈叉叉的陣列,並回傳贏的是 O 還是 X,如果平手或還沒下完,請回傳 draw。

winner([
['O', 'O', 'X'],
['O', 'X', 'X'],
['O', 'X', 'O']
]) 預期回傳值:O

winner([
['O', 'O', 'X'],
['O', 'X', 'X'],
['X', 'X', 'O']
]) 預期回傳值:X

winner([
['O', 'O', 'X'],
['O', 'O', 'X'],
['X', 'X', '']
]) 預期回傳值:draw
function winner(arr) {
// 橫排
    for (let i = 0; i < 3; i += 1) {
        if (arr[i][0] === arr[i][1] && arr[i][1] === arr[i][2]){
            return arr[i][0];
        }
    }

    // 直排
    for (let i = 0; i < 3; i += 1) {
        if (arr[0][i] === arr[1][i] && arr[1][i] === arr[2][i]){
            return arr[0][i];
        }
    }

    // 左斜線
    if (arr[0][0] === arr[1][1] && arr[1][1] === arr[2][2]){
        return arr[0][0];
    }
    // 右斜線
    if (arr[2][2] === arr[1][1] && arr[1][1] === arr[0][0]){
        return arr[0][0];
    }
    return 'draw'

} 
console.log(
    winner([
        ['O', 'O', 'X'],
        ['O', 'X', 'X'],
        ['X', 'X', 'O']
        ]) 
)

console.log(
    winner([
        ['O', 'O', 'X'],
        ['O', 'X', 'X'],
        ['O', 'X', 'O']
        ])
)

練習五:判斷質數

請寫出一個 function isPrime,給定一個數字 n,回傳 n 是否為質數。 (質數的定義:除了 1 以外,沒辦法被所有 < n 的正整數整除)

isPrime(1) 正確回傳值:false isPrime(5) 正確回傳值:true isPrime(37) 正確回傳值:true

function isPrime(n) {

    if(n === 1) return false

    for(var i=2; i<n; i++){

        if ( n % 1 === 0 && n % i === 0){
            return false        
        } 
    }
    return true
}

console.log(isPrime(1))
console.log(isPrime(8))
console.log(isPrime(5))
console.log(isPrime(35)) //原本寫法會顯示為質數是錯誤的。
console.log(isPrime(37))