Tôi có chức năng đệ quy (trong C#) mà tôi cần gọi khoảng 800 triệu lần; điều này rõ ràng thường sẽ dẫn đến tràn ngăn xếp sau khoảng cuộc gọi thứ 900. Tôi đã thực hiện điều này với nhiều vòng lặp, nhưng mô hình đệ quy thì dễ dàng hơn nhiều và dễ bảo trì hơn.Chức năng đệ quy, Ngăn xếp ngăn xếp và Bộ kết hợp Y
Tôi đang xem xét triển khai hàm đệ quy sử dụng bộ kết hợp y, như từ những gì tôi đọc và thấy, sẽ giải quyết vấn đề tràn ngăn xếp và sửa nhiều vòng lồng nhau.
Có ai có kinh nghiệm sử dụng bộ kết hợp y không? Tôi vẫn sẽ bị kẹt trong một ngăn xếp tràn?
Lấy ví dụ đơn giản về giai thừa. Giai thừa trên hầu hết các số lớn hơn 5.000 sẽ gây ra tràn ngăn xếp. Nếu tôi sử dụng một bộ phối hợp y đúng cách trong kịch bản đó, nó sẽ sửa chữa tràn ngăn xếp?
Nó không có vẻ tầm thường để thực hiện, vì vậy tôi muốn xác nhận nó trước khi tôi dành nỗ lực phát triển/tài nguyên triển khai và học y combinator.
Thật không may, không, tôi đang sử dụng C# và lặp qua 3 bộ sưu tập riêng biệt, tạo ra 2 đến 3 bộ sưu tập nội bộ, cần gọi tới 8 phiên bản khác nhau của cùng một chức năng, chỉ với những thứ nhỏ thay đổi giữa chúng. Tôi quản lý để viết lại nó như là một chức năng (vẫn còn gần 120 dòng), mà tự gọi là đệ quy, nhưng không phải với đệ quy đuôi, do đó tại sao nó bom ra xung quanh cuộc gọi thứ 900. –
Như tôi đã hiểu, C# hỗ trợ đệ quy đuôi thích hợp kể từ .NET 4.0: [Cải thiện cuộc gọi đuôi trong .NET Framework 4] (http://blogs.msdn.com/b/clrcodegeneration/archive/2009/05/11/tail -call-improvements-in-net-framework-4.aspx) và [Đệ quy đệ quy trong C# và F #] (http://lookingsharp.wordpress.com/2010/03/08/tail-recursion-in-csharp-and -fsharp /). Nó chắc chắn sẽ tối ưu hóa đệ quy đuôi khi biên dịch cho CPU bất kỳ và chạy chương trình trên máy 64 bit - nếu đó là bất kỳ trợ giúp nào ... –
@SaschaHennig: Tốt để biết, cảm ơn. –