2011-10-27 3 views
8

Supponiamo che in C++ si stiano facendo troppe chiamate ricorsive su una funzione ricorsiva e si verifichi un errore di overflow dello stack.In che modo C++ può utilizzare lo stile di passaggio continuo?

Come si riscriverà questo in uno stile a passaggio continuo per evitare l'overflow dello stack?

Sto riscontrando una leggera difficoltà nel rappresentare questo in C++.

+2

Non otterrete altro che risposte astratte per una domanda così astratta. Forse dovresti pubblicare la funzione di esempio che sta causando l'overflow dello stack, quindi otterrai risposte concrete su come risolverlo. (E personalmente, proverei a riscrivere la funzione per usare un accumulatore prima di riscriverlo per usare una continuazione ...) – ildjarn

+0

Sei arrivato nel posto giusto. –

+0

@ildjarn, grazie per l'avviso. In realtà sto cercando una risposta astratta. Se utilizzo un accumulatore, non lo riscriverò come normale iterazione in C++? – achow

risposta

4

Beh questa è una domanda piuttosto aperta, ma Eric Lippert ha scritto un (ben due in realtà) piuttosto long series about exactly this topic. Non è esattamente la lingua giusta, ma dovrebbe essere ancora abbastanza utile e dare l'idea generale.

Anche se l'implementazione di CPS in C++ sembra molto lavoro solo per risolvere una singola funzione ricorsiva, quando si può semplicemente usare qualche algoritmo per rendere la funzione iterativa con una coda (si usa comunque la stessa quantità di dati, ma l'heap è molto meno limitato).

+1

Ho avuto il chiaro vantaggio di scrivere entrambe le serie nel contesto di lingue che hanno chiusure lessicali come funzionalità di linguaggio incorporata. Riscrivere il codice C++ nelle chiusure è ovviamente del tutto realizzabile, ma sarà un po 'un problema. –

+1

@EricLippert Hai ragione, ho assunto C++ 11 lambda, ma ovviamente non tutti (beh nemmeno vicino alla maggioranza) hanno un compilatore che supporta lambda. Senza di esso, diventa molto più complicato (usare le classi e passare quelle in giro presumibilmente?). Grazie per i tuoi fantastici articoli - senza di te non saprei nemmeno cosa sia CPS :) – Voo

+2

@Voo: Anche senza C++ 11 lambda, ci sono librerie C++ 03 che gestiscono questo banalmente. Vedi per es. [Boost.Phoenix] (http://www.boost.org/libs/phoenix/). – ildjarn