2013-07-30 4 views
5

Am von unten 6: 1 in einer nicht-rekursive Fakultäts-Funktion und bekommt einen Compiler-Fehler zu zählen versucht:F # Für negative Schleifenzählung ab - Typ int nicht unterstützt die Bediener ..-

let fact x = 
    let mutable product = 1 
    for i in x..-1..1 do 
     product <- product * i 
    product 

// Error on the 6 - type 'int' does not support the operator '..-' 
let answer = fact 6 
printfn "%i" answer 

I habe diese Idee aus der Nähe des unteren here

Habe die Funktion geändert, um nur zu zählen und es funktioniert, aber ich bin interessiert zu wissen, warum dies fehlgeschlagen ist. Gibt es einen besseren Weg zum Countdown?

Mit VS2012 Update 3

Antwort

17

Have changed the function to just count up and it works, but I'm interested to know why this failed.

Ihr Beispiel schlägt fehl, weil .. und - zwei verschiedene Operatoren sind, der Compiler benötigt Trennung zwischen diesen. Statt -1 durch Klammern Einwickeln, könnten Sie Leerzeichen hinzu:

let fact x = 
    let mutable product = 1 
    for i in x .. -1 .. 1 do 
     product <- product * i 
    product 

Is there a better way to count down?

Die weniger bekannte for .. downto .. do Konstrukt besser geeignet ist hier zu verwenden.

let fact x = 
    let mutable product = 1 
    for i = x downto 1 do 
     product <- product * i 
    product 
4

Try Klammer verwenden:

... 
for i in x..(-1)..1 do 
... 
8

Dies funktioniert:

let fact x = 
    let mutable product = 1 
    for i in x..(-1)..1 do 
    product <- product * i 
    product 

Da dies tut (wie in dem Link in der Frage verwendet):

let fact x = 
    let mutable product = 1 
    for i in x .. -1 .. 1 do 
    product <- product * i 
    product 

PS: auch n ote, dass es funktionalere Möglichkeiten gibt, eine faktorielle zu berechnen (schlecht zu verwendende veränderbare Variablen); die naheliegendste mit Rekursion:

let rec fact x = 
    if x > 2 
    then x * (fact (x - 1)) 
    else x 

oder ein Einzeiler mit Listen:

let fact x = [2..x] |> List.reduce (*) 
+0

Vielen Dank - vor allem für die mehr funktionale rekursiven Möglichkeiten. Ich gab Punkte für seinen interessanten Ansatz. Wenn ich dir auch Punkte geben könnte, würde ich (und alle anderen, die geantwortet haben)! –