Hướng dẫn what is recursionerror in python? - lỗi đệ quy trong python là gì?

Bạn có thể đã thấy một lỗi đệ quy Python khi chạy mã Python của bạn. Lý do tại sao điều này xảy ra? Có cách nào để khắc phục lỗi này không?

Một ngoại lệ đệ quy Python được nêu ra khi việc thực hiện chương trình của bạn vượt quá giới hạn đệ quy của trình thông dịch Python. Hai cách để giải quyết ngoại lệ này đang tăng giới hạn đệ quy Python hoặc tái cấu trúc mã của bạn bằng cách sử dụng lặp lại thay vì đệ quy.

Hãy cùng đi qua một số ví dụ để bạn có thể hiểu cách thức hoạt động của nó.

Sự đệ quy bắt đầu!

  • Đệ quy: độ sâu đệ quy tối đa vượt quá
  • Giới hạn đệ quy trong Python là gì?
  • Cách bắt lỗi đệ quy Python
  • Làm thế nào để bạn ngăn chặn đệ quy vô hạn trong Python?
  • Cách chuyển đổi đệ quy Python thành cách tiếp cận lặp lại
  • Sự kết luận

Hãy để tạo ra một chương trình để tính toán giai thừa của một số theo công thức bên dưới:

n! = n * (n-1) * (n-2) * ... * 1

Viết một chức năng gọi là giai thừa và sau đó sử dụng các câu lệnh in để in giá trị của giai thừa cho một vài số.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 

Đây là một chức năng đệ quy

Một hàm đệ quy là một hàm tự gọi. Đệ quy không cụ thể cho Python, nó là một khái niệm phổ biến đối với hầu hết các ngôn ngữ lập trình.

Bạn có thể thấy rằng trong câu lệnh khác của nếu khác, chúng tôi gọi chức năng giai thừa chuyển N-1 là tham số.

Việc thực hiện hàm tiếp tục cho đến khi N bằng 0.

Hãy để xem những gì xảy ra khi chúng ta tính toán giai thừa cho hai số nhỏ:

if __name__ == '__main__': 
    print("The factorial of 4 is: {}".format(factorial(4)))
    print("The factorial of 5 is: {}".format(factorial(5)))

[output]
The factorial of 4 is: 24
The factorial of 5 is: 120 

Sau khi kiểm tra xem __name__ có bằng ‘__main__, chúng tôi in giai thừa cho hai số.

Tất cả đều tốt.

Nhưng, đây là những gì xảy ra nếu chúng ta tính toán giai đoạn 1000

print("The factorial of 1000 is: {}".format(factorial(1000)))

[output]
Traceback (most recent call last):
  File "recursion_error.py", line 9, in 
    print("The factorial of 1000 is: {}".format(factorial(1000)))
  File "recursion_error.py", line 5, in factorial
    return n*factorial(n-1)
  File "recursion_error.py", line 5, in factorial
    return n*factorial(n-1)
  File "recursion_error.py", line 5, in factorial
    return n*factorial(n-1)
  [Previous line repeated 995 more times]
  File "recursion_error.py", line 2, in factorial
    if n <= 1:
RecursionError: maximum recursion depth exceeded in comparison 

Việc đệ quy xảy ra vì trình thông dịch Python đã vượt quá giới hạn đệ quy được phép.

Lý do tại sao thông dịch viên Python giới hạn số lần đệ quy có thể được thực hiện là để tránh đệ quy vô hạn và do đó tránh được một luồng tràn.

Hãy để một cái nhìn về cách tìm hiểu giới hạn đệ quy là gì trong Python và cách cập nhật nó.

Giới hạn đệ quy trong Python là gì?

Cách bắt lỗi đệ quy Python

>>> import sys
>>> print(sys.getrecursionlimit())
1000 

Làm thế nào để bạn ngăn chặn đệ quy vô hạn trong Python?

Cách chuyển đổi đệ quy Python thành cách tiếp cận lặp lạiincrease the recursion limit to 1500 we can add the following lines at the beginning of our program:

import sys
sys.setrecursionlimit(1500)

Sự kết luận

The factorial of 1000 is: 4023872600770937735437024339230039857193748642107146325437999104299385123986290205920
.......835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Hãy để tạo ra một chương trình để tính toán giai thừa của một số theo công thức bên dưới:

Viết một chức năng gọi là giai thừa và sau đó sử dụng các câu lệnh in để in giá trị của giai thừa cho một vài số.

Cách bắt lỗi đệ quy Python

Làm thế nào để bạn ngăn chặn đệ quy vô hạn trong Python?

Cách chuyển đổi đệ quy Python thành cách tiếp cận lặp lại

Sự kết luận

if __name__ == '__main__':
    try:
        print("The factorial of 1000 is: {}".format(factorial(1000)))
    except RecursionError as re:
        print("Unable to calculate factorial. Number is too big.") 

Hãy để tạo ra một chương trình để tính toán giai thừa của một số theo công thức bên dưới:: before executing the program remember to comment the line we have added in the section before that increases the recursion limit for the Python interpreter.

Viết một chức năng gọi là giai thừa và sau đó sử dụng các câu lệnh in để in giá trị của giai thừa cho một vài số.

Đây là một chức năng đệ quy

$ python recursion_error.py
Unable to calculate factorial. Number is too big. 

Một hàm đệ quy là một hàm tự gọi. Đệ quy không cụ thể cho Python, nó là một khái niệm phổ biến đối với hầu hết các ngôn ngữ lập trình.

Bạn có thể thấy rằng trong câu lệnh khác của nếu khác, chúng tôi gọi chức năng giai thừa chuyển N-1 là tham số.

$ python2 recursion_error.py 
Traceback (most recent call last):
  File "recursion_error.py", line 13, in 
    except RecursionError as re:
NameError: name 'RecursionError' is not defined 

Việc thực hiện hàm tiếp tục cho đến khi N bằng 0.

Hãy để xem những gì xảy ra khi chúng ta tính toán giai thừa cho hai số nhỏ:

Hướng dẫn what is recursionerror in python? - lỗi đệ quy trong python là gì?

Sau khi kiểm tra xem __name__ có bằng ‘__main__, chúng tôi in giai thừa cho hai số.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
0

Tất cả đều tốt.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
1

Làm thế nào để bạn ngăn chặn đệ quy vô hạn trong Python?

Cách chuyển đổi đệ quy Python thành cách tiếp cận lặp lại

Sự kết luận

Hãy để tạo ra một chương trình để tính toán giai thừa của một số theo công thức bên dưới:

Viết một chức năng gọi là giai thừa và sau đó sử dụng các câu lệnh in để in giá trị của giai thừa cho một vài số.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 

Đây là một chức năng đệ quythe if branch doesn’t make a recursive call. This means that the execution of our function eventually stops.

Một hàm đệ quy là một hàm tự gọi. Đệ quy không cụ thể cho Python, nó là một khái niệm phổ biến đối với hầu hết các ngôn ngữ lập trình.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
3

Bạn có thể thấy rằng trong câu lệnh khác của nếu khác, chúng tôi gọi chức năng giai thừa chuyển N-1 là tham số.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
4

Việc thực hiện hàm tiếp tục cho đến khi N bằng 0.recursion depth limit set by the Python interpreter prevents infinite recursion from occurring.

Cách chuyển đổi đệ quy Python thành cách tiếp cận lặp lại

Sử dụng đệ quy không phải là lựa chọn duy nhất có thể. Một giải pháp thay thế để giải quyết đệ quy là sử dụng một con trăn trong khi vòng lặp.

Về cơ bản chúng tôi đang đi từ đệ quy đến lặp lại.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
5

Đầu tiên, chúng tôi đặt giá trị của giai thừa thành 1 và sau đó tại mỗi lần lặp của vòng lặp trong khi chúng tôi:

  • Nhân giá trị mới nhất của giai thừa với n
  • Giảm N của 1

Việc thực hiện vòng lặp trong khi tiếp tục miễn là N lớn hơn 0.

Tôi muốn đảm bảo rằng việc triển khai giai thừa này trả về kết quả tương tự như việc thực hiện sử dụng đệ quy.

Vì vậy, hãy để xác định một danh sách Python có chứa một vài số. Sau đó, chúng tôi sẽ tính toán giai đoạn của từng số bằng cả hai hàm và so sánh kết quả.

Chúng tôi sử dụng một python cho vòng lặp để đi qua từng số trong danh sách.

Chương trình của chúng tôi kết thúc ngay khi các giai thừa được tính toán bởi hai chức năng cho một số không nhất định.

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
6

Hãy cùng chạy chương trình của chúng tôi và xem những gì chúng tôi nhận được:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n*factorial(n-1) 
7

Great!

Việc chúng tôi thực hiện giai thừa bằng cách sử dụng một cách tiếp cận lặp lại hoạt động tốt.

Sự kết luận

Trong hướng dẫn này, chúng tôi đã thấy lý do tại sao Recursionerror xảy ra trong Python và cách bạn có thể sửa nó.

Hai tùy chọn bạn có là:

  • Tăng giá trị của giới hạn đệ quy cho trình thông dịch Python.
  • Sử dụng lặp lại thay vì đệ quy.

Bạn sẽ sử dụng cái nào?

Bài viết liên quan:

Hướng dẫn what is recursionerror in python? - lỗi đệ quy trong python là gì?

Tôi là một nhà lãnh đạo công nghệ, kỹ sư phần mềm và huấn luyện viên lập trình. Tôi muốn giúp bạn trong hành trình trở thành một nhà phát triển siêu!

Recursionerror là gì?

Python "đệ quy: độ sâu đệ quy tối đa đã vượt quá" xảy ra khi một hàm được gọi là nhiều lần đến nỗi các lời mời vượt quá giới hạn đệ quy. Để giải quyết lỗi, chỉ định một trường hợp cơ sở phải được đáp ứng để thoát khỏi đệ quy hoặc đặt giới hạn đệ quy cao hơn.occurs when a function is being called so many times that the invocations exceed the recursion limit. To solve the error, specify a base case that has to be met to exit the recursion or set a higher recursion limit.

Làm thế nào để Python xử lý các lỗi đệ quy?

Thông dịch viên Python giới hạn giới hạn đệ quy để tránh đệ quy vô hạn. Mô -đun SYS SYS trong Python cung cấp một hàm gọi là SetRecursionLimit () để sửa đổi giới hạn đệ quy trong Python. Phải mất một tham số, giá trị của giới hạn đệ quy mới.The “sys” module in Python provides a function called setrecursionlimit() to modify the recursion limit in Python. It takes one parameter, the value of the new recursion limit.

Độ sâu đệ quy trong Python là gì?

Nếu bạn viết một hàm đệ quy thực thi nhiều hơn một số lần lặp cụ thể (thường là 997), bạn sẽ thấy một lỗi khi bạn đi đến lần lặp tiếp theo.Điều này là do Python giới hạn độ sâu của thuật toán đệ quy.Điều này đề cập đến số lần chức năng có thể gọi chính nó.how many times the function can call itself.

Độ sâu đệ quy là gì?

Trừu tượng.Độ sâu tối đa của đệ quy đề cập đến số mức kích hoạt của một thủ tục tồn tại trong cuộc gọi sâu nhất của thủ tục.the number of levels of activation of a procedure which exist during the deepest call of the procedure.