Lỗi đệ quy python

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 : 120

Như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 comparison

Vì 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 object

xu hướng

[Đã giải quyết] Không tìm thấy tay cầm có nhãn nào để đưa vào chú thích

Đệ 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ó

1000
0

Chạy nhiều ô trong Jupyter Notebook

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

1000
1

là đ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

Nguyên nhân gây ra sự cố "vượt quá tốc độ dữ liệu iopub" và cách khắc phục

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

Lỗi đệ quy trong Python là gì?

Một ngoại lệ Python RecursionError nảy sinh khi việc thực thi 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 . con trăn. Vượt quá độ sâu đệ quy tối đa [Cách khắc phục] Độ sâu đệ quy tối đa trong Python là 1000. Để kiểm tra, hãy gọi sys. hàm getrecursionlimit[].

Điều gì gây ra lỗi đệ quy?

Trong một số cách, đệ quy tương tự như một vòng lặp. Cả hai đều thực thi cùng một mã nhiều lần và cả hai đều yêu cầu một điều kiện [để tránh vòng lặp vô hạn, hay đúng hơn là đệ quy vô hạn trong trường hợp này]. Khi có quá nhiều lệnh gọi hàm hoặc một hàm thiếu trường hợp cơ sở , JavaScript sẽ đưa ra lỗi này.

Lỗi đệ quy có phải là lỗi thời gian chạy không?

Lỗi thời gian chạy được tạo ra bởi hệ thống thời gian chạy nếu xảy ra sự cố trong khi chương trình đang chạy. Hầu hết các thông báo lỗi thời gian chạy bao gồm thông tin về nơi xảy ra lỗi và chức năng nào đang được thực thi. Thí dụ. Đệ quy vô hạn cuối cùng gây ra lỗi thời gian chạy vượt quá độ sâu đệ quy tối đa .

Ý nghĩa của RecursionError là gì?

Điều này có nghĩa là ngăn lệnh gọi không thể vượt quá độ sâu tối đa [1000 theo mặc định] . Vì vậy, trong ví dụ đầu tiên của bạn, hàm oku tự gọi nhiều lần, mỗi lần thêm một lệnh gọi vào ngăn xếp cuộc gọi. Khi oku gọi chính nó 1000 lần độ sâu đệ quy tối đa được nhấn và Python sẽ gây ra lỗi RecursionError.

Chủ Đề