2011-10-27 28 views
8

假设在C++中,你对递归函数做了太多的递归调用,并且出现堆栈溢出错误。C++如何使用延续传递样式?

你会如何以延续传递的风格重写这个以避免堆栈溢出?

我在C++中描述这个有点困难。

+2

对于这样一个抽象问题,你不会得到任何东西,只能得到抽象的答案。也许你应该发布导致堆栈溢出的示例函数,然后你会得到如何解决它的具体答案。 (亲自尝试重写函数以使用累加器,然后重写它以使用延续...) – ildjarn

+0

您来到了正确的位置。 –

+0

@ildjarn,感谢您的通知。我其实在寻找一个抽象的答案。如果我使用累加器,是不是最终将它重写为C++中的正常迭代? – achow

回答

4

那么这是一个相当开放的问题,但Eric Lippert写了一个(实际上是两个)而不是long series about exactly this topic。不完全正确的语言,但它应该仍然是相当有用的,并给出总体思路。

尽管在C++中实现CPS似乎只是修复单个递归函数的很多工作,但您可以使用某种算法使该函数与队列迭代(您仍然使用基本相同的数据量,但该堆远不如限制)。

+1

我在将词汇关闭作为内置语言功能的语言环境中编写了这两个系列的独特优势。将C++代码重写为闭包当然是完全可以实现的,但这会有点痛苦。 –

+1

@EricLippert你是对的我假设C++ 11 lambda表达式,但显然不是每个人(甚至不接近大多数)有一个支持lambdas的编译器。没有它,它会变得更加复杂(使用类并将其推广到大概?)。顺便说一句,谢谢你的伟大的文章 - 没有你,我甚至不知道什么CPS是:) – Voo

+2

@Voo:即使没有C++ 11 lambda,也有C++ 03库处理这种平凡。见例如[Boost.Phoenix](http://www.boost.org/libs/phoenix/)。 – ildjarn