2011-08-16 73 views
13

Tôi có một câu hỏi về sys.setrecursionlimit()Python max đệ quy, thắc mắc về sys.setrecursionlimit()

từ doc trăn chức năng này:

Đặt độ sâu tối đa của thông dịch Python ngăn xếp để giới hạn. Giới hạn này ngăn cản đệ quy vô hạn gây ra tràn của ngăn xếp C và làm rơi Python. Giới hạn cao nhất có thể là phụ thuộc vào nền tảng. Người dùng có thể cần đặt giới hạn cao hơn khi có chương trình yêu cầu đệ quy sâu và nền tảng hỗ trợ giới hạn cao hơn. Điều này nên được thực hiện cẩn thận, bởi vì một giới hạn quá cao có thể dẫn đến sự cố.

Đây là câu hỏi của tôi:

chúng ta hãy chức năng này vô dụng đệ quy:

def rec(N): 
    if N==0: 
     return 1 
    else: 
     return rec(N-1); 

bây giờ hãy thiết lập các đệ quy tối đa đến 100:

sys.setrecursionlimit(100) 

Nếu tôi cố gắng rec(99) (100 các cuộc gọi đệ quy), tôi nhận được:

RuntimeError: maximum recursion depth exceeded 

Để tính toán rec (99), tôi cần đặt giới hạn đệ quy thành 105

Tại sao lại như vậy?

Trả lời

13

Tên được đặt tên kém. Nó nên nói Stack Depth, không phải đệ quy sâu. Đệ quy ngụ ý nó lặp đi lặp lại cùng một chủ đề mà nó hạn chế. Trong thực tế, bạn có thể có mã thực tế chỉ có 100 cuộc gọi sâu. Tôi sẽ không giới thiệu nó, nhưng bạn có thể. Họ có thể thoát khỏi nó bởi vì trong thế giới thực tế, lần duy nhất bạn từng chạy vào kịch bản này là với đệ quy. Khi bạn sụp đổ vì điều này, nhìn thấy từ "đệ quy" cung cấp cho bạn một đầu mối ngay lập tức của những gì để tìm kiếm như trái ngược với "Stack".

(Ngăn xếp nên cung cấp cho bất kỳ lập trình viên phù hợp cùng một đầu mối, nhưng hãy trung thực, mã của bạn chỉ bị rơi và bạn muốn có một thông báo lỗi có liên quan, phải không? 99,99999% thời gian này cho bạn biết chính xác những gì bạn sai lầm (bạn bỏ lỡ trường hợp cơ bản của bạn để đệ quy.))

+0

Thx, tôi đoán tôi nên đọc kỹ hơn định nghĩa và không xem xét tên của hàm –

4

Vẫn còn các cuộc gọi hàm mà thời gian chạy Python cần phải thực hiện để thậm chí có được chức năng của bạn.

4

Nó dựa trên độ sâu ngăn xếp TOTAL và không thực sự là độ sâu của bất kỳ chức năng đơn cụ thể nào. Có thể bạn đã ở độ sâu ngăn xếp 5 khi bạn thực hiện cuộc gọi đầu tiên tới rec().

Lấy ví dụ 5 chức năng đệ quy. Mỗi lần thực hiện 98 cuộc gọi đệ quy với cuộc gọi cuối cùng đến hàm đệ quy tiếp theo. Với giới hạn đệ quy là 100, bạn có thực sự muốn cho phép mỗi hàm đệ quy thực hiện 99 cuộc gọi với tổng độ sâu ~ 500 cuộc gọi không? Không, điều đó có thể làm hỏng thông dịch viên ở những độ sâu đó.

Do đó giới hạn đệ quy là độ sâu tối đa của tất cả các chức năng trên toàn cầu, không phải bất kỳ hàm nào được đặt tên duy nhất.

Các vấn đề liên quan