Значение или конструктор не определены
Я изучаю 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 ответов
В 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)
, хотя решение позволяет оставаться в рамках простых чисел.