2011-10-27 9 views
8

Supongamos que en C++ hace demasiadas llamadas recursivas en una función recursiva y obtiene un error de desbordamiento de pila.¿Cómo puede utilizar C++ el estilo de continuación de paso?

¿Cómo reescribirías esto en un estilo de continuación y paso para evitar el desbordamiento de la pila?

Tengo una ligera dificultad para imaginar esto en C++.

+2

No obtendrá nada más que respuestas abstractas para una pregunta tan abstracta. Tal vez deberías publicar la función de ejemplo que está causando el desbordamiento de la pila, luego obtendrás respuestas concretas sobre cómo solucionarlo. (Y personalmente, trataría de reescribir la función para usar un acumulador antes de volver a escribirlo para usar una continuación ...) – ildjarn

+0

Llegaste al lugar correcto. –

+0

@ildjarn, gracias por el aviso. En realidad estoy buscando una respuesta abstracta. Si uso un acumulador, ¿no terminaré reescribiéndolo como una iteración normal en C++? – achow

Respuesta

4

Bueno, esa es una pregunta bastante abierta, pero Eric Lippert escribió una (bien dos en realidad) en lugar de long series about exactly this topic. No es exactamente el idioma correcto, pero debería ser bastante útil y ofrecer la idea general.

Aunque implementar CPS en C++ parece mucho trabajo solo para arreglar una sola función recursiva, cuando puedes usar un algoritmo para hacer la función iterativa con una cola (aún usas básicamente la misma cantidad de datos, pero el montón está mucho menos restringido).

+1

Tuve la clara ventaja de escribir ambas series en el contexto de idiomas que tienen cierres léxicos como una función de lenguaje integrado. Reescribir el código C++ en cierres es, por supuesto, totalmente alcanzable, pero será un poco doloroso. –

+1

@EricLippert Tienes razón asumí C++ 11 lambdas, pero obviamente no todos (ni siquiera cerca de la mayoría) tienen un compilador que admita lambdas. Sin él, se vuelve mucho más complicado (¿usa clases y las pasa presumiblemente?). Por cierto, gracias por tus excelentes artículos: sin ti, ni siquiera sabría qué es CPS :) – Voo

+2

@Voo: incluso sin C++ 11 lambdas, existen bibliotecas C++ 03 que manejan esto trivialmente. Ver p. [Boost.Phoenix] (http://www.boost.org/libs/phoenix/). – ildjarn

Cuestiones relacionadas