2012-03-10 30 views
8

Tôi đang học f # và tôi có một vấn đề khá tầm thường không có vẻ hợp lý. Tôi đang làm việc trên dự án Euler vấn đề 2 và tôi đã nhận điều này:Giá trị hoặc hàm tạo không được xác định

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

Tôi đã có lỗi tại fib gọi đệ quy:

Giá trị hoặc constructor 'fib' không được định nghĩa

Và tôi không chắc tại sao. Bất kỳ giúp đỡ?

+0

System.Int32.MaxValue >> 4000000 và "các thuật ngữ có giá trị" – BLUEPIXY

+0

@BLUEPIXY: Vâng, tôi biết đây không phải là giải pháp chính xác hoặc hiệu quả cho vấn đề tại thời điểm này. Đó là một nỗ lực lặp đi lặp lại. Tôi chỉ cố gắng hoàn toàn nhận được tất cả cú pháp. –

Trả lời

13

fib là hàm đệ quy, nó phải bắt đầu bằng let rec.

7

Trong F #, nếu bạn muốn viết một hàm đệ quy, bạn phải sử dụng 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 

Đó là bởi vì trong F # điều kiện bình thường, bạn chỉ có thể sử dụng định danh tuyên bố trước mã hiện tại, không giống như trong C#.

3

Nói về Project Euler Problem 2, bạn có thể xem xét thay vì đệ quy đi với Seq.unfold, mà là rất thành ngữ và cung cấp cho bạn tất cả các số Fibonacci cùng một lúc:

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

Bây giờ fibs đại diện cho chuỗi lười biếng của số Fibonacci:

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

Và để làm cho nó là BigInteger chỉ cần thay thế (1,2) bởi (1I,2I), mặc dù giải pháp cho phép bạn ở trong phạm vi bình thường số nguyên.

+0

Thậm chí nhiều thành ngữ sẽ được cho phép fibs = (1,2) |> Seq.unfold (vui vẻ (hiện tại, tiếp theo) -> Một số (hiện tại, (tiếp theo, hiện tại + tiếp theo))) –

+0

Thú vị. Tôi vừa bắt đầu đọc về foldl/foldr nhưng vẫn gặp sự cố khi nắm bắt đầy đủ các ứng dụng của họ. Tôi sẽ cho một shot. Cảm ơn. –

+0

@SnOrfus: Để xem phần này phù hợp với bối cảnh giải pháp đầy đủ mà bạn có thể muốn xem tại đây (http://infsharpmajor.wordpress.com/2011/09/28/project-euler-problem-2/) –

Các vấn đề liên quan