Làm cách nào để thoát khỏi lỗi đệ quy trong python?

Tôi có một mã mà tôi nghĩ rằng tôi có nhiều vấn đề với. Mã này có chức năng đệ quy. Và rõ ràng khả năng lặp lại của tôi trong đối số hàm phụ thuộc vào đầu vào có thể vượt quá độ sâu đệ quy. Khi tìm kiếm, tôi thấy rằng độ sâu đệ quy có thể được đặt thành các giá trị khác. Nhưng mà. Nếu tôi gặp lỗi như vậy, điều này có nghĩa là. Lẽ ra tôi nên chọn một số cách tiếp cận khác ngoài đệ quy khi biết rằng vấn đề không áp đặt giới hạn cho số được nhập? . (nếu có thể, nghe có vẻ lạ đối với tôi) Tôi không tìm kiếm giải pháp. Không có giải pháp. Tôi đang tìm cách làm quen với việc tự khắc phục sự cố trong tương lai. Đây là mã ví dụ. https. //mã số. tự học. com/cTmGCFktNghO/?ref=app (Sửa. một thay đổi tối thiểu cuối cùng mà tôi đã thực hiện đối với mã khiến nó xuất ra cùng một thứ ở mọi điều kiện. Xin lỗi vì điều đó, đã loại bỏ nó, cảm ơn lưu ý) Cảm ơn tất cả trước

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

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ó

1000
0

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

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

[Đã 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

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

Điều này có nghĩa là khi bạn cung cấp đầu vào lớn cho hàm đệ quy, bạn sẽ gặp lỗi . Điều này được thực hiện để tránh tràn ngăn xếp. Trình thông dịch Python giới hạn giới hạn đệ quy để tránh các lần truy cập vô hạn. Xử lý giới hạn đệ quy –

Lỗi đệ quy là gì?

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.

Tại sao Python có giới hạn đệ quy?

Giới hạn đệ quy mặc định của Python là 1000, nghĩa là Python sẽ không để một hàm tự gọi hơn 1000 lần, điều này đối với hầu hết mọi người có lẽ là đủ. Giới hạn tồn tại vì cho phép đệ quy xảy ra hơn 1000 lần không chính xác tạo ra mã nhẹ