2017-12-06 1 views
2

Ich habe eine FunktionF # Continuation-basierte Schwanz-Rekursion

let rec f n = function | 0   -> 1 
         | k when k>0 -> n * (f n (k-1)) 
         | _   -> failwith "illegal argument" 

Welche k mal ein int n und multipliziert ihn mit sich nimmt. Beispiel:

f 3 3 
val it : int = 27 

Nun, ich habe es als Schwanz-rekursive Funktion neu geschrieben, um zu versuchen und zu einem besseren Verständnis von allem zu bekommen:

let fT n y = 
    let rec loop acc = function 
     | 0   -> 1 
     | k when k>0 -> n * (loop acc (k-1)) 
     | _   -> failwith "illegal argument" 
    loop 0 y 

ich Interesse hätte, die diese verwendet Fortsetzung dabei -basierte Schwanz-Rekursion, aber ich bin ein wenig hängen, was es aber tun sollten:

let rec fC n c = 
    match n with 
    | 0   -> c 1 
    | k when k>0 -> n * (fC n (fun x -> ...) //Not sure what to do here 

Irgendwelche Hinweise?

Antwort

3

im rekursiven Fall Sie einen weiteren Fortsetzung konstruieren müssen, die das Ergebnis von dem rekursiven Aufruf empfängt, ruft dann die anfängliche Fortsetzung mit dem durch den aktuellen Wert von n multiplizierten Ergebnis:

let rec fC n y c = 
    match y with 
    | 0 -> c 1 
    | k when k > 0 -> fC n (k-1) (fun r -> c (n * r)) 
    | _ -> failwith "illegal argument" 

dann

fT 3 3 
> 27 

fC 3 3 id 
> 27 
+0

Danke für die Eingabe, aber ich habe gerade festgestellt, dass das Original 'f' zwei Argumente braucht. Also sollte es nicht 'fC n k c = ...' sein? – Khaine775

+0

@ Khaine775 - Siehe Update. – Lee

+0

Es gibt einen Fall für die Zusammensetzung '(c << (*) n)' anstelle der Funktion Anwendung: Sie können die Reihenfolge der Ausführung bei Bedarf leichter umkehren. – kaefer