Gần đây tôi đã bắt đầu học Python và tôi khá ngạc nhiên khi thấy 1000 giới hạn đệ quy sâu (theo mặc định). Nếu bạn đặt nó đủ cao, khoảng 30000, nó bị treo với một lỗi phân đoạn giống như C. Mặc dù, C dường như đi khá cao hơn rất nhiều.Ngôn ngữ yêu thích của bạn xử lý đệ quy sâu như thế nào?
(The folks Python nhanh chóng chỉ ra rằng bạn luôn có thể chuyển đổi chức năng đệ quy cho những người lặp đi lặp lại và họ luôn nhanh hơn. Đó là 100% sự thật. Đó không phải là thực sự những gì câu hỏi của tôi là về mặc dù.)
Tôi đã thử thí nghiệm tương tự ở Perl và khoảng 10 triệu lượt truy cập nó tiêu thụ hết 4 hợp đồng ram của tôi và tôi đã sử dụng^C để ngừng thử. Rõ ràng Perl không sử dụng C stack, nhưng nó sử dụng một số lượng vô lý của bộ nhớ khi nó đệ quy - không khủng khiếp gây sốc xem xét bao nhiêu công việc nó đã làm để gọi chức năng.
Tôi đã thử ở Pike và hoàn toàn ngạc nhiên khi nhận được 100.000.000 lượt truy cập trong khoảng 2 giây. Tôi không có ý tưởng làm thế nào nó đã làm điều đó, nhưng tôi nghi ngờ nó làm phẳng đệ quy đến một quá trình lặp đi lặp lại - nó dường như không tiêu thụ bất kỳ bộ nhớ thêm trong khi nó hiện nó. [Lưu ý: Pike không flatten trường hợp tầm thường, nhưng segfaults về cái phức tạp hơn, hoặc vì vậy tôi nói với.]
tôi đã sử dụng các chức năng khác vô dụng:
int f(int i, int l) { if(i<l) return f(i+1,l); return i; }
sub f { return f($_[0]+1, $_[1]) if $_[0]<$_[1]; return $_[0] };
def f(i,l):
if i<l:
return f(i+1,l)
return i
Tôi rất tò mò ngôn ngữ như thế nào khác (ví dụ, PHP, Ruby, Java, Lua, Ocaml, Haskell) xử lý đệ quy và tại sao họ xử lý nó theo cách đó. Ngoài ra, xin lưu ý rằng nó có tạo sự khác biệt không nếu hàm này "đệ quy đuôi" (xem chú thích).
Ví dụ của bạn là đệ quy đuôi, vì vậy bất kỳ triển khai ngôn ngữ nào hỗ trợ đệ quy đuôi sẽ chuyển đổi hiệu quả cuộc gọi đệ quy thành "goto". – mfx