2012-03-10 11 views
8

Sto imparando f # e ho un problema piuttosto banale che non sembra avere senso. Sto lavorando su Project Euler problema 2 e ho ottenuto questo:Valore o costruttore non definito

let fib (x : BigInteger) (y : BigInteger) (max : BigInteger) = 
    let added = x + y 
    if added > max then y 
    else fib y (x + y) max 

ho ottenuto l'errore alla chiamata fib ricorsiva:

valore o il costruttore 'fib' non è definito

E non sono sicuro del perché. Qualsiasi aiuto?

+0

System.Int32.MaxValue >> 4000000 e "termini con valore pari" – BLUEPIXY

+0

@BLUEPIXY: Sì, so che al momento non è una soluzione corretta o efficace al problema. È un tentativo iterativo. Sto solo cercando di ottenere tutta la sintassi. –

risposta

13

Perché fib è la funzione ricorsiva, deve iniziare con let rec.

7

in F #, se si vuole scrivere una funzione ricorsiva, è necessario utilizzare the rec keyword:

let rec fib (x : BigInteger) (y : BigInteger) (max : BigInteger) = 
    let added = x + y 
    if added > max then y 
    else fib y (x + y) max 

Questo perché in F # in circostanze normali, è possibile utilizzare solo identificatori dichiarati prima il codice corrente, a differenza di C#.

3

Parlando di Project Euler Problem 2, si può considerare, invece di ricorsione andare con Seq.unfold, che è molto idiomatica e ti dà tutti i numeri di Fibonacci in una volta:

let fibs = Seq.unfold (fun (current, next) -> 
    Some(current, (next, current + next))) (1,2) 

Ora fibs rappresenta sequenza pigro di numeri di Fibonacci:

>fibs;; 
val it : seq<int> = seq[1; 2; 3; 5; ...] 

E per renderlo di BigInteger basta sostituire (1,2) per (1I,2I), anche se la soluzione consente di rimanere all'interno di ordinario interi.

+0

Ancora più idiomatico sarebbe permesso fibs = (1,2) |> Seq.unfold (fun (corrente, successiva) -> Alcuni (corrente, (successiva, corrente + successiva))) –

+0

Interessante. Ho appena iniziato a leggere su foldl/foldr, ma ho ancora problemi a cogliere appieno le loro applicazioni. Darò uno scatto. Grazie. –

+0

@SnOrfus: per vedere come questo pezzo si adatta al contesto completo della soluzione, è possibile dare un'occhiata a [qui] (http://infsharpmajor.wordpress.com/2011/09/28/project-euler-problem-2/) –

Problemi correlati