2012-03-10 18 views
8

Estoy aprendiendo f # y tengo un problema bastante trivial que no parece tener sentido. Estoy trabajando en un problema Proyecto Euler 2 y tengo esto:Valor o constructor no está definido

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

Tengo el error en la llamada recursiva de fib:

Valor o 'fib' constructor no está definido

Y no estoy seguro de por qué. ¿Alguna ayuda?

+0

System.Int32.MaxValue >> 4000000, y "términos de igual valor" – BLUEPIXY

+0

@BLUEPIXY: Sí, sé que no es una solución correcta o eficiente para el problema en este momento. Es un intento iterativo. Solo intento obtener toda la sintaxis. –

Respuesta

13

Porque fib es una función recursiva, tiene que comenzar por let rec.

7

En F #, si desea escribir una función recursiva, se tienen que utilizar 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 

Eso es porque en Fa # en circunstancias normales, sólo se puede usar identificadores declarados antes el código actual, a diferencia de C#.

3

Hablando de Project Euler Problem 2, puede considerar en lugar de recursividad ir con Seq.unfold, que es muy idiomático y le da todos los números de Fibonacci a la vez:

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

Ahora fibs representa la secuencia perezosa de los números de Fibonacci:

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

Y para que sea de BigInteger simplemente sustituya por (1,2)(1I,2I), aunque la solución le permite mantenerse dentro ordinaria enteros.

+0

Aún más idiomático sería dejar fibs = (1,2) |> Seq.unfold (divertido (actual, siguiente) -> Some (actual, (siguiente, actual + siguiente))) –

+0

Interesante. Acabo de comenzar a leer sobre foldl/foldr pero todavía tengo problemas para entender completamente sus aplicaciones. Voy a dar una oportunidad. Gracias. –

+0

@SnOrfus: para ver cómo encaja esta pieza en el contexto de la solución completa, es posible que desee consultar [aquí] (http://infsharpmajor.wordpress.com/2011/09/28/project-euler-problem-2/) –