2012-03-10 3 views
8

Я изучаю 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 

Я получил ошибку при рекурсивном вызове выдумка:

Value или конструктор «выдумка» не определен

И я не уверен, почему. Любая помощь?

+0

System.Int32.MaxValue >> 4000000 и «четные термины» – BLUEPIXY

+0

@BLUEPIXY: Да, я знаю, что это не правильное или эффективное решение проблемы на данный момент. Это итеративная попытка. Я просто пытаюсь полностью получить весь синтаксис. –

ответ

13

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

7

В F #, если вы хотите написать рекурсивную функцию, вы должны использовать 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 

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

3

Говоря о 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), хотя это решение позволяет вам оставаться в пределах обычного целые числа.

+0

Еще более идиоматично будет показано, что fibs = (1,2) |> Seq.unfold (fun (current, next) -> Some (current, (next, current + next))) –

+0

Интересно. Я только начал читать о foldl/foldr, но у меня все еще есть проблемы с полным пониманием их приложений. Я сделаю это. Благодарю. –

+0

@SnOrfus: Чтобы увидеть, как эта деталь подходит для полного контекста решения, вы можете захотеть заглянуть [здесь] (http://infsharpmajor.wordpress.com/2011/09/28/project-euler-problem-2/) –

Смежные вопросы