2016-07-19 17 views
1

I eine rekursive Funktion haben, die die Ausgabe des vorherigen Anruf als den Eingang des nächsten Anrufs verwendet:R: Sammeln Zwischenausgang der rekursiven Funktion

recurse_foo = function(input) { 
    if(identical(input, character(0))) return(NULL) 
    else { 
    uu = get_incremental_output(input) ## <-- interested in collecting this 
    return(recurse_foo(uu)) 
    } 
} 

Wie ersichtlich, die Terminal-Ausgabe ist nicht sehr interessant und ich bin daran interessiert, die Zwischenergebnisse zu sammeln, aber ich kann mir nicht vorstellen, dass das Wachstum einer globalen Liste oder irgendein anderer Nebeneffekt elegant wäre (was das Einzige ist, was mir einfällt).

Irgendwelche anderen Abstraktionen, die hier nützlich sein könnten?

Danke.


Konkretes Beispiel:

final_countdown = function(input) { 
    if (input/2 < 1) return(NULL) 
    else { 
    uu = input/2   # <-- interested in collecting this 
    print(uu) 
    return(final_countdown(uu)) 
    } 
} 

final_countdown(100) 

In diesem Fall bin ich daran interessiert, die Folge von uu s bei der Erhebung, die print ed sind.

+0

es gut wäre ein Beispiel Eingang zu haben, und das gewünschte Ergebnis. –

+0

Vielleicht können Sie es in eine Textdatei schreiben und nicht im Speicher behalten? Später können Sie es bei Bedarf verwenden –

+0

@PorkChop Ja, ich erwähnte, dass Nebenwirkungen (einschließlich Schreiben in Datei) Optionen sind. Ich habe auf eine rein funktionale Art gehofft, dies zu tun. – tchakravarty

Antwort

1

Dies ist eine Lösung, wenn sämtliche Zwischenausgänge des gleichen Typs sind:

final_countdown = function(input) { 
    if (input/2 < 1) return(NA) 
    else { 
    c(input, final_countdown(input/2)) 
    } 
} 
+0

'c (Eingabe/2, final_countdown (Eingabe/2))', aber sehr nett. Sehr im Geist der Eleganz, die ich suchte. Ich bin überrascht (genervt), dass mir diese Lösung nicht eingefallen ist. ;) – tchakravarty