2010-06-05 12 views
7

Ich würde gerne die .tail IL-Anweisung sehen, aber die einfachen rekursiven Funktionen mit Tail-Calls, die ich geschrieben habe, sind anscheinend in Schleifen optimiert. Ich schätze das, da ich mir nicht ganz sicher bin, wie eine Schleife in Reflector aussieht. Ich sehe definitiv keine .tail Opcodes. Ich habe "Tail Calls generieren" in den Eigenschaften meines Projekts aktiviert. Ich habe auch versucht, Debug und Release Builds in Reflector.Was ist ein einfacher F # Code, der den .tail IL Befehl erzeugt?

Der Code, den ich verwendet wird, ist von Programming F# by Chris Smith, Seite 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 

Kann jemand etwas einfach F # -Code vorschlagen, die .tail tatsächlich generieren?

Antwort

6

Mutually rekursiven Funktionen sollten:

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) 

(habe es nicht gerade jetzt versucht).

EDIT

Siehe auch

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

+1

Ich habe gerade jetzt überprüft. Ja! es erzeugt .tail. –