Hiểu Python đệ quy

Thuật ngữ này có thể được định nghĩa là quá trình xác định một cái gì đó theo chính nó. Nói một cách đơn giản, đó là một quá trình trong đó một chức năng gọi chính nó trực tiếp hoặc gián tiếp.  

Hiểu Python đệ quy
 

Ưu điểm của việc sử dụng đệ quy

  • Một hàm phức tạp có thể được chia thành các bài toán con nhỏ hơn bằng cách sử dụng đệ quy
  • Tạo trình tự đơn giản hơn thông qua đệ quy hơn là sử dụng bất kỳ phép lặp lồng nhau nào
  • Các hàm đệ quy làm cho mã trông đơn giản và hiệu quả

Nhược điểm của việc sử dụng đệ quy

  • Rất nhiều bộ nhớ và thời gian được thực hiện thông qua các cuộc gọi đệ quy khiến việc sử dụng trở nên tốn kém
  • Các hàm đệ quy rất khó gỡ lỗi
  • Lý do đằng sau đệ quy đôi khi có thể khó suy nghĩ thấu đáo

cú pháp

def func(): <--
              |
              | (recursive call)
              |
    func() ----

ví dụ 1. Dãy Fibonacci là dãy số nguyên 0, 1, 1, 2, 3, 5, 8….  

Python3




# Program to print the fibonacci series upto n_terms

 

# Recursive function

def recursive_fibonacci(n):

  

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
0
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
1
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
3_______1_______4

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
5_______1_______6
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
7

  

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
5_______1_______6
Factorial of number 6 = 720
3
Factorial of number 6 = 720
4_______1_______3
Factorial of number 6 = 720
6
Factorial of number 6 = 720
7
Factorial of number 6 = 720
8
Factorial of number 6 = 720
4
720
0
720
1

 

720
2_______1_______2
720
4

 

720
5

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
0
720
7
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
720
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

  

720
2_______20_______3
720
4
Factorial of number 6 = 720
6

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

  

720
2_______20_______3# Program to print the fibonacci series upto n_terms1
Factorial of number 6 = 720
6

# Program to print the fibonacci series upto n_terms3 # Program to print the fibonacci series upto n_terms4# Program to print the fibonacci series upto n_terms5 # Program to print the fibonacci series upto n_terms6# Program to print the fibonacci series upto n_terms7

# Program to print the fibonacci series upto n_terms8

720
2# Recursive function0

Đầu ra

Fibonacci series:
0
1
1
2
3
5
8
13
21
34

ví dụ 2. Giai thừa của 6 được ký hiệu là 6. = 1*2*3*4*5*6 = 720.  

Python3




# Recursive function1

# Recursive function2

 

# Recursive function

def # Recursive function5

  

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
0
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
7
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
3
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
5_______1_______6
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
7

  

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
5_______1_______6
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
7recursive_fibonacci(n):2 recursive_fibonacci(n):3
Factorial of number 6 = 720
4
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
3
Factorial of number 6 = 720
6

 

recursive_fibonacci(n):7

recursive_fibonacci(n):8_______1_______2   0

 

  1

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
0   3
720
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

  

720
2_______20_______3  9
Factorial of number 6 = 720
6

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
01 recursive_fibonacci(n):8
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
720
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

  

720
2_______20_______3
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
10_______13_______6

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
4

  

720
2_______20_______3
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
17_______1_______18
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
19
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
20

Đầu ra

Factorial of number 6 = 720

Đệ quy đuôi là gì?

Một loại đệ quy duy nhất trong đó thủ tục cuối cùng của hàm là một lệnh gọi đệ quy. Đệ quy có thể được tự động hóa bằng cách thực hiện yêu cầu trong khung ngăn xếp hiện tại và trả về đầu ra thay vì tạo khung ngăn xếp mới. Đệ quy đuôi có thể được trình biên dịch tối ưu hóa, điều này làm cho nó tốt hơn các hàm đệ quy không đuôi.  

Có thể tối ưu hóa chương trình bằng cách sử dụng hàm đệ quy đuôi thay vì hàm đệ quy không đuôi không?
Xem xét hàm được đưa ra dưới đây để tính giai thừa của n, chúng ta có thể nhận thấy rằng hàm này thoạt nhìn giống như một hàm đệ quy đuôi nhưng nó là một hàm không đệ quy đuôi. Nếu quan sát kỹ, chúng ta có thể thấy rằng giá trị được trả về bởi Recur_facto(n-1) được sử dụng trong Recur_facto(n), do đó, lệnh gọi Recur_facto(n-1) không phải là điều cuối cùng được thực hiện bởi Recur_facto(n).  

Python3




Fibonacci series:
0
1
1
2
3
5
8
13
21
34
21

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
22

 

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
23

def

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
25

  

# Program to print the fibonacci series upto n_terms8

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
0
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
29
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
2
720
9
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
33

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
34
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
6
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
3

  

# Program to print the fibonacci series upto n_terms8

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
6
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
7recursive_fibonacci(n):2
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
42
Factorial of number 6 = 720
4
Fibonacci series:
0
1
1
2
3
5
8
13
21
34
3
Factorial of number 6 = 720
6

  

Fibonacci series:
0
1
1
2
3
5
8
13
21
34
47

720
2_______1_______49  0
720
1

Đầu ra

720

Chúng ta có thể viết hàm Recur_facto đã cho dưới dạng hàm đệ quy đuôi. Ý tưởng là sử dụng thêm một đối số và trong đối số thứ hai, chúng tôi điều chỉnh giá trị của giai thừa. Khi n về 0, trả về giá trị cuối cùng của giai thừa của số mong muốn.  

Nhược điểm của đệ quy trong Python là gì?

Mặc dù nó làm cho mã trông gọn gàng hơn, nhưng đôi khi có thể khó theo dõi
Chúng có thể đơn giản hơn, nhưng các cuộc gọi đệ quy rất tốn kém. Chúng chiếm nhiều bộ nhớ và thời gian
Cuối cùng, không dễ để gỡ lỗi một hàm đệ quy

Đệ quy hoạt động như thế nào?

Đệ quy thực hiện một số lần gọi hàm lặp lại từ bên trong hàm . Điều kiện đệ quy thực hiện các lệnh gọi hàm lặp lại cho đến khi trường hợp cơ sở được đáp ứng. Trường hợp cơ sở có mặt bên trong hàm và khi điều kiện của trường hợp cơ sở được thỏa mãn, nó sẽ dừng thực thi.

đệ quy cho người giả là gì?

Một hàm được gọi là hàm đệ quy nếu nó tự gọi đi gọi lại chính nó . Đệ quy có thể là trực tiếp cũng như gián tiếp. Đệ quy trực tiếp là khi một hàm gọi chính nó. Trong khi đệ quy gián tiếp là khi một hàm gọi một hàm khác và hàm được gọi lần lượt gọi hàm gọi.