Thực tế có một vài vấn đề ở đây.
Đầu tiên, như là NPE's answer giải thích một cách độc đáo, Python không loại bỏ các cuộc gọi đuôi, vì vậy nhiều chức năng cho phép đệ quy không giới hạn, ví dụ, Scheme bị giới hạn trong Python.
Thứ hai, như được giải thích bởi NPE, các cuộc gọi không thể loại bỏ chiếm dung lượng trên ngăn xếp cuộc gọi. Và, ngay cả trong các ngôn ngữ làm TCE, có rất nhiều hàm đệ quy không thể được xử lý như lặp lại. (Hãy xem xét hàm Fibonacci ngây thơ mà gọi đệ quy gọi chính nó hai lần.)
Nhưng tại sao cuộc gọi ngăn xếp một tài nguyên hữu hạn ở vị trí đầu tiên? Khung stack Python có thể ít nhất về nguyên tắc được thực hiện trên heap và liên kết với nhau (xem Stackless cho một bằng chứng tồn tại của nguyên tắc đó), và trong một không gian bộ nhớ 64-bit, có chỗ cho toàn bộ hơn 1000 khung stack. (Trong thực tế, ngay cả các C stack trên hầu như bất kỳ nền tảng hiện đại có thể tổ chức toàn bộ hơn 1000 cuộc gọi thông dịch Python đệ quy.)
Một phần lý do là lịch sử: cổ phiếu Python thông dịch viên sử dụng C cố định để gọi chính nó đệ quy bất cứ khi nào bạn thực hiện một cuộc gọi đệ quy, và nó ban đầu được thiết kế cho nền tảng 32 bit (và thậm chí là 24 hoặc 20 bit) trong đó ngăn xếp C là khá nhỏ.
Nhưng điều đó có thể đã bị thay đổi và Python 3.0 sẽ là một nơi hoàn hảo để thay đổi nó. Vì vậy, tại sao họ không? Bởi vì họ đã đưa ra quyết định thiết kế ngôn ngữ có ý thức. Trong mã Pythonic, đệ quy thường rất nông (ví dụ, mã như os.walk
đi qua cấu trúc cây nông); nếu chức năng của bạn đạt đến độ sâu bất cứ nơi nào gần 1000, nó có nhiều khả năng là một lỗi hơn là cố ý. Vì vậy, giới hạn ở lại. Tất nhiên đây là một chút thông tư - nếu họ loại bỏ giới hạn (và, đặc biệt, nếu họ loại bỏ các cuộc gọi đuôi), đệ quy sâu hơn sẽ trở nên thành ngữ hơn. Nhưng đó là một điểm - Guido không muốn một ngôn ngữ mà đệ quy sâu sắc là thành ngữ. (Và hầu hết cộng đồng Python đồng ý.)
Giải pháp đệ quy "hấp dẫn" có một số khía cạnh không hấp dẫn. Đầu tiên, nó có hành vi O (n ** 2) vì bạn liên tục xây dựng danh sách mới để mở rộng chúng. Thứ hai, nó quá phức tạp vì bạn chỉ có thể lặp lại để tạo ra các số tự nhiên. Đây là một ví dụ về viết Python như thể nó là Scheme hoặc Haskell. Ngôn ngữ khác nhau là tốt ở những thứ khác nhau. Sử dụng lặp lại. –