Hướng dẫn stop recursion in python - dừng đệ quy trong python

Xem thảo luận

Nội phân chính

  • Làm thế nào để bạn ngăn ngừa lỗi đệ quy?
  • Lỗi đệ quy trong Python là gì?
  • Làm thế nào để bạn đặt giới hạn trong đệ quy?
  • Có giới hạn đệ quy trong Python không?

Cải thiện bài viết

Lưu bài viết

  • Đọc
  • Bàn luận
  • Xem thảo luận

    Cải thiện bài viết

    Lưu bài viết

    Đọc
    In this article, we shall look at why this error occurs and how to handle it in Python. To understand this, we need to first look at tail recursion.
    Tail recursion
    In a typical recursive function, we usually make the recursive calls first, and then take the return value of the recursive call to calculate the result. Therefore, we only get the final result after all the recursive calls have returned some value. But in a tail recursive function, the various calculations and statements are performed first and the recursive call to the function is made after that. By doing this, we pass the results of the current step to the next recursive call to the function. Hence, the last statement in a Tail recursive function is the recursive call to the function. 
    This means that when we perform the next recursive call to the function, the current stack frame (occupied by the current function call) is not needed anymore. This allows us to optimize the code. We Simply reuse the current stack frame for the next recursive step and repeat this process for all the other function calls.
    Using regular recursion, each recursive call pushes another entry onto the call stack. When the functions return, they are popped from the stack. In the case of tail recursion, we can optimize it so that only one stack entry is used for all the recursive calls of the function. This means that even on large inputs, there can be no stack overflow. This is called Tail recursion optimization.
    Languages such as lisp and c/c++ have this sort of optimization. But, the Python interpreter doesn’t perform tail recursion optimization. Due to this, the recursion limit of python is usually set to a small value (approx, 10^4). This means that when you provide a large input to the recursive function, you will get an error. This is done to avoid a stack overflow. The Python interpreter limits the recursion limit so that infinite recursions are avoided.

    Bàn luậnHandling recursion limit –
    The “sys” module in Python provides a function called setrecursionlimit() to modify the recursion limit in Python. It takes one parameter, the value of the new recursion limit. By default, this value is usually 10^3. If you are dealing with large inputs, you can set it to, 10^6 so that large inputs can be handled without any errors.
    Example:
    Consider a program to compute the factorial of a number using recursion. When given a large input, the program crashes and gives a “maximum recursion depth exceeded error”.

    Python3

    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.

    def fact(n):

    Các

            ____10 fact(n):1

        fact(n):0 fact(n):4fact(n):5 fact(n):6fact(n):7 fact(n):1fact(n):9

        if6if7

    if     1==     4    5 
     

    Hướng dẫn stop recursion in python - dừng đệ quy trong python

    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.

    def fact(n):

    Các

            ____10 fact(n):1

        fact(n):0 fact(n):4fact(n):5 fact(n):6fact(n):7 fact(n):1fact(n):9

        if6if7

    if     1==     4    5 
     


    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.