2010-06-05 12 views
7

Chciałbym zobaczyć instrukcję IL z .tail, ale proste funkcje rekursywne wykorzystujące połączenia ogona, które pisałem, są najwyraźniej zoptymalizowane w pętle. Zgaduję, że tak, ponieważ nie jestem całkiem pewien, jak wygląda pętla w Reflectorze. Zdecydowanie nie widzę jednak żadnych kodów opcyjnych .tail. Mam "Generuj wywołania ogona" sprawdzone we właściwościach mojego projektu. Próbowałem również obu wersji debugowania i wydania w Reflectorze.Jaki jest prosty kod F #, który generuje instrukcję .tail IL?

Kod użyłem jest od Programming F# by Chris Smith, strona 190:

let factorial x = 
// Keep track of both x and an accumulator value (acc) 
let rec tailRecursiveFactorial x acc = 
    if x <= 1 then 
     acc 
    else 
     tailRecursiveFactorial (x - 1) (acc * x) 
tailRecursiveFactorial x 1 

Czy ktoś może sugerować jakąś prostą F # kod, który rzeczywiście przyniesie .tail?

Odpowiedz

6

funkcje wzajemnie rekurencyjne należy:

let rec even n = 
    if n = 0 then 
     true 
    else 
     odd (n-1) 
and odd n = 
    if n = 1 then 
     true 
    else 
     even (n-1) 

(nie próbowałem go właśnie teraz).

EDIT

Zobacz również

How do I know if a function is tail recursive in F#

+1

Sprawdziłem przed chwilą. Tak! generuje .tail. –

Powiązane problemy