Như tên gợi ý, Lỗi đệ quy có thể xảy ra khi chúng ta xử lý các hàm đệ quy. Khi chúng ta chạy hàm đệ quy nhiều lần, sẽ xảy ra lỗi đệ quy. Python có giới hạn về số lần hàm đệ quy có thể gọi chính nó. Điều này được thực hiện để đảm bảo rằng chức năng không thực thi vô hạn và dừng lại sau một số lần lặp lại. Để biết giới hạn đệ quy trong python, chúng ta sử dụng đoạn mã sau
import sys print(sys.getrecursionlimit())
đầu ra là
1000Đệ quyLỗi. Đã vượt quá độ sâu đệ quy tối đa khi gọi một đối tượng Python
Chúng ta hãy xem một ví dụ về RecursionError. vượt quá độ sâu đệ quy tối đa. Chúng ta sẽ lấy một ví dụ về hàm giai thừa .
Đoạn mã sau sẽ tạo giai thừa cho một số đã cho
def find_fact(n): if n == 0 or n == 1: return 1 else : return (n*find_fact(n-1)) print("Factorial is :", find_fact(5))
Ở đây, chương trình này sẽ được thực hiện thành công và sẽ in đầu ra bên dưới
Factorial is : 120Nhưng nếu chúng ta chuyển một số lớn hơn vào hàm find_fact(), nó sẽ ném RecursionError. Lỗi vượt quá độ sâu đệ quy tối đa
print("Factorial is :", find_fact(5000))
đầu ra
RecursionError: maximum recursion depth exceeded in comparisonVì hàm đệ quy vượt quá giới hạn 1000 lần lặp nên lỗi đệ quy được đưa ra
Lỗi đệ quy. Độ sâu đệ quy tối đa Lỗi vượt quá cũng có thể được đưa ra trong khi chúng tôi đang cố gắng tạo một danh sách lồng nhau có độ dài vượt quá giới hạn đệ quy
Chúng ta hãy lấy ví dụ sau. Chúng tôi đã tạo một hàm có tên là lồng nhau () chấp nhận một đối số – n. Tùy thuộc vào giá trị của n, độ dài của danh sách lồng nhau đó sẽ được tạo. Chúng ta hãy thử chuyển một giá trị n lớn hơn giới hạn đệ quy
def nested(n): list1 = list2 = [] for i in range(n): list1.append([]) list1 = list1[0] return list2 nestedlist = nested(2000) print(nestedlist)
Đầu ra sẽ là một lỗi đệ quy
RecursionError: maximum recursion depth exceeded while getting the repr of an objectxu hướng
Hướng dẫn cơ bản về Python __all__
Đệ quyLỗi. Đã vượt quá độ sâu đệ quy tối đa khi gọi một đối tượng Python
Lỗi đệ quy cho Độ sâu đệ quy tối đa đã vượt quá khi gọi một đối tượng Python được đưa ra khi chúng tôi đang cố gọi một đối tượng python trong Django. Lỗi cũng có thể xảy ra khi sử dụng Flask
Khi trình thông dịch phát hiện đã đạt đến độ sâu tối đa cho đệ quy, nó sẽ đưa ra lỗi đệ quy. Để ngăn ngăn xếp bị tràn, python tăng đệ quy
Các phương pháp hay nhất để tránh RecursionError. Đã vượt quá độ sâu đệ quy tối đa khi gọi một đối tượng Python
1. Sử dụng các vòng lặp khác thay vì đệ quy
Để ngăn lỗi xảy ra, chúng ta chỉ cần chuyển đổi đoạn mã từ đệ quy thành câu lệnh lặp
Nếu lấy ví dụ về hàm giai thừa, chúng ta có thể chuyển nó thành hàm không đệ quy. Chúng tôi làm điều đó bằng cách đặt một vòng lặp for bên trong hàm đệ quy. Vòng lặp for sẽ thực thi với độ dài bằng với giá trị của số giai thừa.
________số 8
Bây giờ, nó sẽ không đưa ra bất kỳ lỗi đệ quy nào và chỉ cần in số giai thừa lớn
2. sử dụng sys. hàm setrecursionlimit()
Ngược lại, nếu vẫn muốn sử dụng hàm đệ quy, chúng ta có thể tăng giới hạn đệ quy từ 1000 lên một số cao hơn. Để làm được điều đó, trước tiên chúng ta phải nhập thư viện sys. Sử dụng thư viện sys, chúng ta sẽ sử dụng sys. hàm setrecursionlimit()
import sys sys.setrecursionlimit(2000)
Bây giờ, nó sẽ không ném lỗi đệ quy và chương trình sẽ được thực thi với số lượng đệ quy lớn hơn. Khi thực thi hàm đệ quy, nó sẽ không đưa ra bất kỳ lỗi nào và in đầu ra của nó
10000
Mọi thứ về Python SortedDict
3. Đặt điều kiện biên
Cần đặt điều kiện biên để đảm bảo hàm đệ quy kết thúc. Trong chương trình giai thừa, điều kiện
10001là điều kiện biên. Với điều kiện này, vòng lặp kết thúc
4. Tạo một đệ quy hội tụ
Trong khi viết điều kiện đệ quy, người ta phải đảm bảo rằng điều kiện kết thúc và không tiếp tục vô hạn. Các cuộc gọi đệ quy cuối cùng sẽ có xu hướng hướng tới điều kiện biên
Chúng tôi phải đảm bảo rằng chúng tôi tạo ra một điều kiện hội tụ cho điều đó. Trong chương trình giai thừa, ‘n*fact(n-1)’ là điều kiện hội tụ giá trị từ n đến 1
xu hướng
[Đã sửa] ModuleNotFoundError. Không có mô-đun nào được đặt tên là Pycocotools
5. Sử dụng ghi nhớ
Chúng tôi cũng có thể sử dụng ghi nhớ để giảm thời gian tính toán của các giá trị đã được tính toán. Bằng cách này, chúng ta có thể tăng tốc độ tính toán bằng cách ghi nhớ các phép tính trong quá khứ
Khi các cuộc gọi đệ quy được thực hiện, thì với tính năng ghi nhớ, chúng ta có thể lưu trữ các giá trị được tính toán trước đó thay vì tính toán lại chúng một cách không cần thiết
Điều đó tổng hợp bài viết về RecursionError. Đã vượt quá độ sâu đệ quy tối đa khi gọi một đối tượng Python. Nếu bạn có bất kỳ câu hỏi nào trong đầu, đừng quên cho chúng tôi biết trong phần bình luận bên dưới