2011-10-27 16 views
8

Giả sử trong C++, bạn đang thực hiện quá nhiều cuộc gọi đệ quy trên một hàm đệ quy và nhận được lỗi tràn ngăn xếp.Làm cách nào để C++ sử dụng kiểu chuyển tiếp tiếp?

Bạn sẽ viết lại điều này theo kiểu chuyển tiếp liên tục để tránh tràn ngăn xếp như thế nào?

Tôi đang gặp khó khăn nhỏ khi mô tả điều này trong C++.

+2

Bạn sẽ không nhận được bất kỳ điều gì ngoài câu trả lời trừu tượng cho một câu hỏi trừu tượng như vậy. Có lẽ bạn nên đăng các chức năng ví dụ đó gây ra tràn ngăn xếp, sau đó bạn sẽ nhận được câu trả lời cụ thể về cách sửa chữa nó. (Và cá nhân, tôi sẽ cố gắng viết lại hàm để sử dụng một bộ tích lũy trước khi viết lại nó để sử dụng một sự tiếp tục ...) – ildjarn

+0

Bạn đã đến đúng nơi. –

+0

@ildjarn, cảm ơn thông báo. Tôi thực sự đang tìm kiếm một câu trả lời trừu tượng. Nếu tôi sử dụng một bộ tích lũy, tôi sẽ không viết lại nó như là sự lặp lại bình thường trong C++? – achow

Trả lời

4

Vâng, đó là một câu hỏi khá mở, nhưng Eric Lippert đã viết một (thực tế là hai) thay vì long series about exactly this topic. Không chính xác đúng ngôn ngữ, nhưng nó vẫn khá hữu ích và đưa ra ý tưởng chung. Mặc dù việc triển khai CPS trong C++ có vẻ như rất nhiều công việc chỉ để sửa một hàm đệ quy, khi bạn có thể sử dụng một số thuật toán để làm cho hàm lặp lại với hàng đợi (bạn vẫn sử dụng cùng một lượng dữ liệu, nhưng heap là ít bị hạn chế).

+1

Tôi có lợi ích riêng biệt khi viết cả hai chuỗi đó trong ngữ cảnh của các ngôn ngữ có đóng cửa từ vựng như một tính năng ngôn ngữ được tích hợp sẵn. Viết lại mã C++ vào bao đóng là tất nhiên hoàn toàn có thể đạt được, nhưng nó sẽ là một chút đau đớn. –

+1

@EricLippert Bạn nói đúng Tôi giả sử C++ 11 lambdas, nhưng rõ ràng không phải tất cả mọi người (thậm chí không gần với đa số) có một trình biên dịch hỗ trợ lambdas. Nếu không có nó, nó sẽ phức tạp hơn nhiều (sử dụng các lớp và chuyển những người xung quanh có lẽ?). Btw cảm ơn cho bài viết tuyệt vời của bạn - mà không có bạn tôi thậm chí sẽ không biết những gì CPS là :) – Voo

+2

@Voo: Ngay cả khi không có C++ 11 lambdas, có C + + 03 thư viện xử lý này tầm thường. Xem ví dụ [Boost.Phoenix] (http://www.boost.org/libs/phoenix/). – ildjarn

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