Skip to main content

Recursion - Đệ quy là gì

"Recursion is when a function calls itself until it doesn't"

Là một hàm gọi chính nó cho tới khi dừng.
Vậy khi nào nó dừng?
Khi nó thỏa điều kiện và không gọi chính nó nữa! (Duh? I'm I a joke to you)
Vâng đúng là như vậy.
Trong Recursion nó hai phần chính:
- Base case: Trường hợp cơ bản - Tại case này, hàm sẽ không gọi lại chính nó nữa => Recursion sẽ dừng lại.
- Recursive case: Trường hợp recursive - Như tên gọi, case này thì hàm sẽ tiếp tục gọi (recursive) chính nó tiếp.

Ví dụ: Bằng bài toàn tìm giai thừa (factorial)

function factorial(num) {
if (num === 1) return 1 // Base case
return num * factorial(num - 1) // Recursive case
}

console.log(factorial(4)) // 24
Để hiểu hơn, hãy xem Call stack của hàm trên:
4. factorial(1) | return 1
3. factorial(2) | return 2 * factorial(1)
2. factorial(3) | return 3 * factorial(2)
1. factorial(4) | return 4 * factorial(3)

Như vậy sau khi hàm dừng recursive thì Call stack sẽ được dỡ ra và các giá trị sẽ lần lượt được return vào nơi đã gọi nó.
Ta sẽ có:

4. return 1
3. 1 >> return 2 * factorial(1) tức 2 * 1 = 2
2. 2 >> return 3 * factorial(2) tức 3 * 2 = 6
1. 6 >> return 4 * factorial(3) tức 4 * 6 = 24

Hãy tìm một vài bài toán về recursive tự làm thử, bạn sẽ dần hiểu ngay thôi

Comments

Popular posts from this blog

Closures

Closures is (a fancy term for) a function that remembers outside things that are used inside const createPrinter() {   const name = 'Alex'   const printName = () => {     console.log(name)   }   return printName } const myPrinter = createPrinter() myPrinter() // Alex This function that was return from from createPrinter function is called a closure . // Here is printName Closure is a combination of a function and the environment where it was declared .

React Asynchronous setState

setState is asynchronous action - If you need to use the updated state to do something, you should use a callback function in setState , so it will call after the state is updated: this.setState({data: newData}, () => console.log(this.state.data)) - If you wanna update the state with anything else, for example, set the '"title" to be "Hello", you can use the object in setState function, like this: this.setState({title: 'Hello'}) - But if you have to take the current state and use it to evaluate what to update, you should pass a function to setState function, so you will have access to the previous state and previous props. It will guarantees that you always get the latest update of the state or props: this.setState((prevState, prevProps) => {     return {count: prevState.count + 1}   } )

Array.fill()

Caveat: If you .fill() an Array with an object, all elements refer to the same instance (i.e., the object isn’t cloned) So if you do something like: let a = Array(3).fill([]) // create an array named a and fill it with 3 empty array a[2].push('poop') // push new value to the element array at index 2 expect [ [], [], [2]] But because all element refer to the same instance, so the result is: [[2], [2], [2]] More details here:  https://2ality.com/2018/12/creating-arrays.html