Значение или конструктор не определены - PullRequest
8 голосов
/ 10 марта 2012

Я изучаю f #, и у меня есть довольно тривиальная проблема, которая, кажется, не имеет смысла. Я работаю над проблемой Project Euler 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 ]

13 голосов
/ 10 марта 2012

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

7 голосов
/ 10 марта 2012

В 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 #.

3 голосов
/ 10 марта 2012

Говоря о Project Euler Problem 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) на (1I,2I), хотя решение позволяет вам оставаться в пределах обычных целых чисел.

...