Hướng dẫn stop recursion in python - dừng đệ quy trong python
Xem thảo luận Nội phân chính Cải thiện bài viết Lưu bài viết Xem thảo luận Cải thiện bài viết Lưu bài viết Đọc Bàn luậnHandling recursion limit
– Python3Khi bạn thực hiện một hàm đệ quy trong Python trên một đầu vào lớn (> 10^4), bạn có thể gặp phải độ sâu đệ quy tối đa vượt quá lỗi vượt quá lỗi. Đây là một lỗi phổ biến khi thực hiện các thuật toán như DFS, giai thừa, v.v. trên các đầu vào lớn. Điều này cũng phổ biến trong lập trình cạnh tranh trên nhiều nền tảng khi bạn đang cố gắng chạy một thuật toán đệ quy về các trường hợp thử nghiệm khác nhau. & NBSP; Trong bài viết này, chúng ta sẽ xem xét lý do tại sao lỗi này xảy ra và cách xử lý nó trong Python. Để hiểu điều này, trước tiên chúng ta cần xem xét đệ quy đuôi. Đệ quy đuôi Một hàm đệ quy điển hình, chúng ta thường thực hiện các cuộc gọi đệ quy trước, sau đó lấy giá trị trả về của cuộc gọi đệ quy để tính kết quả. Do đó, chúng tôi chỉ nhận được kết quả cuối cùng sau khi tất cả các cuộc gọi đệ quy đã trả về một số giá trị. Nhưng trong một hàm đệ quy đuôi, các tính toán và câu lệnh khác nhau được thực hiện trước tiên và cuộc gọi đệ quy cho hàm được thực hiện sau đó. Bằng cách này, chúng tôi chuyển kết quả của bước hiện tại cho cuộc gọi đệ quy tiếp theo đến hàm. Do đó, câu lệnh cuối cùng trong hàm đệ quy đuôi là cuộc gọi đệ quy đến hàm. & Nbsp; điều này có nghĩa là khi chúng ta thực hiện cuộc gọi đệ quy tiếp theo đến hàm, khung ngăn xếp hiện tại (bị chiếm bởi lệnh gọi hàm hiện tại) không cần thiết nữa . Điều này cho phép chúng tôi tối ưu hóa mã. Chúng tôi chỉ cần sử dụng lại khung ngăn xếp hiện tại cho bước đệ quy tiếp theo và lặp lại quy trình này cho tất cả các cuộc gọi chức năng khác. Sử dụng đệ quy chính quy, mỗi cuộc gọi đệ quy đẩy một mục khác vào ngăn xếp cuộc gọi. Khi các chức năng trở lại, chúng được bật ra từ ngăn xếp. Trong trường hợp đệ quy đuôi, chúng ta có thể tối ưu hóa nó để chỉ có một mục nhập ngăn xếp được sử dụng cho tất cả các cuộc gọi đệ quy của hàm. Điều này có nghĩa là ngay cả trên các đầu vào lớn, không thể có tràn ngăn xếp. Điều này được gọi là tối ưu hóa đệ quy đuôi. Các ngôn ngữ như LISP và C/C ++ có loại tối ưu hóa này. Nhưng, thông dịch viên Python không thực hiện tối ưu hóa đệ quy đuôi. Do đó, giới hạn đệ quy của Python thường được đặt thành một giá trị nhỏ (xấp xỉ, 10^4). Điều này có nghĩa là khi bạn cung cấp một đầ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 chồng. Thông dịch viên Python giới hạn giới hạn đệ quy để tránh đệ quy vô hạn. & nbsp; & nbsp; Xử lý giới hạn đệ quy của 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. Theo mặc định, giá trị này thường là 10^3. Nếu bạn đang xử lý các đầu vào lớn, bạn có thể đặt nó thành, 10^6 để có thể xử lý các đầu vào lớn mà không có bất kỳ lỗi nào. Ví dụ: Xem xét một chương trình để tính toán giai thừa của một số sử dụng đệ quy. Khi được đưa ra một đầu vào lớn, chương trình sẽ gặp sự cố và đưa ra một độ sâu đệ quy tối đa vượt quá lỗi.
Các
Các Python3Đầu ra: & nbsp; & nbsp; Sử dụng phương thức SetRecursionLimit (), chúng ta có thể tăng giới hạn đệ quy và chương trình có thể được thực thi mà không có lỗi ngay cả trên các đầu vào lớn. & NBSP; Khi bạn thực hiện một hàm đệ quy trong Python trên một đầu vào lớn (> 10^4), bạn có thể gặp phải độ sâu đệ quy tối đa vượt quá lỗi vượt quá lỗi. Đây là một lỗi phổ biến khi thực hiện các thuật toán như DFS, giai thừa, v.v. trên các đầu vào lớn. Điều này cũng phổ biến trong lập trình cạnh tranh trên nhiều nền tảng khi bạn đang cố gắng chạy một thuật toán đệ quy về các trường hợp thử nghiệm khác nhau. & NBSP; Trong bài viết này, chúng ta sẽ xem xét lý do tại sao lỗi này xảy ra và cách xử lý nó trong Python. Để hiểu điều này, trước tiên chúng ta cần xem xét đệ quy đuôi. Đệ quy đuôi Một hàm đệ quy điển hình, chúng ta thường thực hiện các cuộc gọi đệ quy trước, sau đó lấy giá trị trả về của cuộc gọi đệ quy để tính kết quả. Do đó, chúng tôi chỉ nhận được kết quả cuối cùng sau khi tất cả các cuộc gọi đệ quy đã trả về một số giá trị. Nhưng trong một hàm đệ quy đuôi, các tính toán và câu lệnh khác nhau được thực hiện trước tiên và cuộc gọi đệ quy cho hàm được thực hiện sau đó. Bằng cách này, chúng tôi chuyển kết quả của bước hiện tại cho cuộc gọi đệ quy tiếp theo đến hàm. Do đó, câu lệnh cuối cùng trong hàm đệ quy đuôi là cuộc gọi đệ quy đến hàm. & Nbsp; điều này có nghĩa là khi chúng ta thực hiện cuộc gọi đệ quy tiếp theo đến hàm, khung ngăn xếp hiện tại (bị chiếm bởi lệnh gọi hàm hiện tại) không cần thiết nữa . Điều này cho phép chúng tôi tối ưu hóa mã. Chúng tôi chỉ cần sử dụng lại khung ngăn xếp hiện tại cho bước đệ quy tiếp theo và lặp lại quy trình này cho tất cả các cuộc gọi chức năng khác. Sử dụng đệ quy chính quy, mỗi cuộc gọi đệ quy đẩy một mục khác vào ngăn xếp cuộc gọi. Khi các chức năng trở lại, chúng được bật ra từ ngăn xếp. Trong trường hợp đệ quy đuôi, chúng ta có thể tối ưu hóa nó để chỉ có một mục nhập ngăn xếp được sử dụng cho tất cả các cuộc gọi đệ quy của hàm. Điều này có nghĩa là ngay cả trên các đầu vào lớn, không thể có tràn ngăn xếp. Điều này được gọi là tối ưu hóa đệ quy đuôi. Các ngôn ngữ như LISP và C/C ++ có loại tối ưu hóa này. Nhưng, thông dịch viên Python không thực hiện tối ưu hóa đệ quy đuôi. Do đó, giới hạn đệ quy của Python thường được đặt thành một giá trị nhỏ (xấp xỉ, 10^4). Điều này có nghĩa là khi bạn cung cấp một đầ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 chồng. Thông dịch viên Python giới hạn giới hạn đệ quy để tránh đệ quy vô hạn. & nbsp; & nbsp; Xử lý giới hạn đệ quy của 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. Theo mặc định, giá trị này thường là 10^3. Nếu bạn đang xử lý các đầu vào lớn, bạn có thể đặt nó thành, 10^6 để có thể xử lý các đầu vào lớn mà không có bất kỳ lỗi nào. Ví dụ: Xem xét một chương trình để tính toán giai thừa của một số sử dụng đệ quy. Khi được đưa ra một đầu vào lớn, chương trình sẽ gặp sự cố và đưa ra một độ sâu đệ quy tối đa vượt quá lỗi.
Các
Làm thế nào để bạn ngăn ngừa lỗi đệ quy?Cácincreasing the recursion limit ( sys. setrecursionlimit ) or re-writing your code without recursion. Return the current value of the recursion limit, the maximum depth of the Python interpreter stack. This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python. Lỗi đệ quy trong Python 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 để bạn đặt giới hạn trong đệ quy?Nhận và đặt giới hạn đệ quy trong Python (Sys ... Nhận giá trị hiện tại của giới hạn đệ quy: sys.getRecursionLimit (). Đặt giá trị hiện tại của giới hạn đệ quy: sys.setrecursionlimit (). Thay đổi kích thước tối đa của ngăn xếp cuộc gọi: resource.setrlimit (). Có giới hạn đệ quy trong Python không?Giới hạn đệ quy mặc định của Python là 1000, có nghĩa là Python sẽ không để một chức năng tự gọi hơn 1000 lần, điều mà đối với hầu hết mọi người có thể 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 cho mã nhẹ., meaning that Python won't let a function call on itself more than 1000 times, which for most people is probably enough. The limit exists because allowing recursion to occur more than 1000 times doesn't exactly make for lightweight code. |