LeetCode JavaScript 30 Days Challenge – Day2 – 2620. Counter

    LeetCode JavaScript 30 Days ChallengeLeetCode Js-Number

    Given an integer n, return a counter function. This counter function initially returns n and then returns 1 more than the previous value every subsequent time it is called (n, n + 1, n + 2, etc).

    給予一個整數 n,回傳一個計數的函式。
    這個計數函式在最初的時候回傳 n,並在後續調用時回傳 (n、n + 1、n + 2),然後每次返回都比前一個值多 1 的值。
    

    Example 1:

    Input: 
    n = 10 
    ["call","call","call"]
    Output: [10,11,12]
    

    Example 2:

    Input: 
    n = -2
    ["call","call","call","call","call"]
    Output: [-2,-1,0,1,2]
    

    solution:
    首先要注意題目給予的函式運用了閉包(closure)的概念,在計數的部分可以運用後置遞增運算符 n++ 來做運算,
    遞增運算符 ++ 的作用是將操作數的值增加 1,並返回遞增後的值。但在這種情況下,n++ 實際上是將 n 的值返回,然後才將 n 的值增加 1。
    當首次調用 counter() 時,n 的初始值是 10。因此,它會返回當前的值 10,然後將 n 的值增加 1,變成 11。
    接下來,當再次調用 counter() 時,n 的值已經是 11。這時,它會返回 11,然後將 n 的值增加 1,變成 12。
    每次調用 counter() 都會先返回 n 的值,然後將 n 的值增加 1,這樣就實現了遞增的效果(n、n+1、n+2)。

    ex. Closure(閉包) : 在函式中須參照外部參數的行為,可以透過閉包的特性來運用 private 變數到 function 中。

    let b = 0.9
     
    function multiply(a) {
      return a * b
    }
    
    console.log(multiply(10)) //9
    

    Code 1: BigO(1)

    var createCounter = function(n) {
        return function() {
            return n++
        };
    };
    

    FlowChart:
    Example 1

    const counter = createCounter(10)
    counter() // 10
    counter() // 11
    counter() // 12
    

    Example 2

    const counter = createCounter(-2)
    counter() // -2
    counter() // -1
    counter() // 0
    counter() // 1
    counter() // 2
    

    ex. Closure => Curring