2010-06-05 21 views
7

Me gustaría ver la instrucción .tail IL, pero las funciones recursivas simples que utilizan llamadas de cola que he estado escribiendo aparentemente están optimizadas en bucles. De hecho, estoy adivinando esto, ya que no estoy muy seguro de cómo se ve un lazo en Reflector. Definitivamente no veo ningún código de operación .tail. He marcado "Generate tail calls" en las propiedades de mi proyecto. También probé las compilaciones Debug and Release en Reflector.¿Qué es un simple código F # que genera la instrucción .tail IL?

El código que he utilizado es de Programming F# by Chris Smith, página 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 

Puede alguien sugerir algunos simples # código F que de hecho va a generar .tail?

Respuesta

6

funciones mutuamente recursivas deben:

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) 

(no se han probado en este momento).

EDITAR

Véase también

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

+1

he comprobado en este momento. ¡Sí! genera .tail. –

Cuestiones relacionadas