2010-06-05 13 views
7

Mi piacerebbe vedere l'istruzione IL .tail, ma le semplici funzioni ricorsive che utilizzano le chiamate tail che ho scritto sono apparentemente ottimizzate nei loop. In realtà sto indovinando su questo, perché non sono del tutto sicuro di come si presenta un loop in Reflector. Sicuramente non vedo nessun opcode .tail. Ho "Genera chiamate di coda" selezionate nelle proprietà del mio progetto. Ho anche provato le versioni di debug e release in Reflector.Cos'è un semplice codice F # che genera l'istruzione .tail IL?

Il codice che ho usato da Programming F# by Chris Smith, pagina 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 

Qualcuno può suggerire qualche semplice codice F #, che sarà davvero generare .tail?

risposta

6

funzioni mutuamente ricorsive devono:

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) 

(non hanno provato solo ora).

EDIT

Vedi anche

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

+1

Ho controllato solo ora. Sì! genera. coda. –

Problemi correlati