2011-11-02 44 views
8

Câu hỏi này là nhiều hơn về sự tò mò hơn so với tiện ích. Nếu tôi đang viết một hàm được cho là chạy mãi mãi, ví dụ như một daemon, Python sẽ xử lý nó như thế nào nếu tôi gọi hàm đó một lần nữa từ cuối hàm?Có phải là một tội lỗi để sử dụng đệ quy vô hạn cho các vòng vô hạn trong Python?

def daemonLoop(): 

    # Declare locals 

    # Do stuff 

    daemonLoop() 

Tôi khá chắc chắn rằng làm điều này trong C sẽ cho kết quả trong một ngăn xếp tràn, nhưng với mức độ trừu tượng từ C để Python Tôi đoán thứ được xử lý khác nhau.

Tôi có đến địa ngục này không?

+0

Mọi người truy cập địa ngục cho các vòng quỷ, chứ không phải cho daemon ;-) Trong Python, bạn sẽ chỉ nhận được ngoại lệ, "RuntimeError: độ sâu đệ quy tối đa đã vượt quá". –

Trả lời

1

Phiên bản C của trình thông dịch Python (có thể là những gì bạn đang sử dụng) sẽ gây ra lỗi cuối cùng nếu bạn không bao giờ quay trở lại từ daemonLoop. Tôi không chắc chắn về các phiên bản khác.

+0

Tại sao thông dịch viên lại đưa ra lỗi nếu bạn không bao giờ quay trở lại? Điều này không rõ ràng hoặc sai. – agf

5

Độ sâu đệ quy tối đa có thể được lấy ra với sys.getrecursionlimit() và thiết lập với sys.setrecursionlimit().

Would I go to hell for this?

Có. CPython không có Loại bỏ đệ quy đuôi/Tối ưu hóa cuộc gọi cuối cùng.

def recurse(): 
    recurse() 

recurse() 

Lỗi:

 
    # 1000 or so lines of this: 
    File "", line 2, in recurse 
RuntimeError: maximum recursion depth exceeded 
1

Tôi không biết lý do tại sao bạn muốn suy nghĩ về làm một cái gì đó như thế khi bạn chỉ có thể có một while vòng lặp vô hạn. Dù sao cho câu hỏi của bạn về việc liệu nó có hoạt động hay không:

... 
    File "test.py", line 7, in daemonLoop 
    daemonLoop() 
    File "test.py", line 7, in daemonLoop 
    daemonLoop() 
RuntimeError: maximum recursion depth exceeded 

Vì vậy, đúng vậy.

0
(define forever (lambda() (forever))) 

Loại đệ quy này là ngôn ngữ Lisp giống như phương án được tạo cho!

+0

Vâng, nhưng đó không phải là câu hỏi. – delnan

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