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 >> 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ỏ:
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]
0Tất cả đều tốt.
def factorial[n]:
if n == 0:
return 1
else:
return n*factorial[n-1]
1Là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]
3Bạ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]
4Việ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]
6Hã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]
7Great!
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:
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!