Значение или конструктор не определены

Я изучаю f# , и у меня есть довольно тривиальная проблема, которая, похоже, не имеет смысла. Я работаю над проблемой 2 проекта Эйлера, и у меня есть это:

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

У меня есть ошибка при рекурсивном вызове fib:

значение или конструктор 'fib' не определен

и я не уверен, почему. Любой помочь?

3 ответов


, потому что fib является рекурсивной функцией, она должна начинаться с let rec.


В F#, Если вы хотите написать рекурсивную функцию, вы должны использовать на rec ключевое слово:

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

это потому, что в F# при нормальных обстоятельствах, вы можете использовать идентификаторы, объявленные до текущий код, в отличие от C#.


говорить Задача Проекта Эйлера 2, вы можете рассмотреть вместо рекурсии происходит с Seq.unfold, что очень идиоматично и дает вам все числа Фибоначчи сразу:

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

теперь fibs представляет ленивую последовательность чисел Фибоначчи:

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

и сделать его BigInteger просто заменить (1,2) by (1I,2I), хотя решение позволяет оставаться в рамках простых чисел.