2017-10-31 23 views
6

Xin chào Im rất mới với F # cũng như lập trình. Im cố gắng để tìm hiểu nó ngay bây giờ và đã ghi danh vào một khóa học nhưng tôi vẫn không có vẻ để có được nó. xin giúp đỡ. Im cố gắng để viết lại đoạn mã sau:viết lại mã bằng cách sử dụng mẫu phù hợp với F #

let rec msort xs = 
    let sz = List.length xs 
    if sz < 2 then xs 
    else let n = sz/2 
     let ys = xs. [0..n-1] 
     let zs = xs.[n..sz-1] 
     in merge (msort ys) (msort zs) 

//************ Utility-funktion merge 

let rec merge xs ys = if List.isEmpty xs then ys else if 
List.isEmpty ys then xs else let x = List.head xs 
     let y = List.head ys 
     let xs = List.tail xs 
     let ys = List.tail ys 
     in if x < y then x :: merge xs (y::ys) 
       else y :: merge (x::xs) ys </i> 

Giải pháp của tôi - mà isnt làm việc:

let rec msort xs = 
    let sz = List.length xs 
    match sz with 
    | sz < 2 -> xs 
    |_ -> n = sz/2 
      let ys = xs. [0..n-1] 
      let zs = xs.[n..sz-1] 
      in merge (msort ys) (msort zs)  


//************ Utility-funktinen merge 

let rec merge xs ys = match xs with |[] -> [ys] 
    match ys with 
     |[] -> [xs] |_ -> 
     let x = List.head xs 
     let y = List.head ys 
     let xs = List.tail xs 
     let ys = List.tail ys if x < y then x :: merge xs (y::ys) 
            |_ -> 
             y :: merge (x::xs) y 
+2

Chào mừng bạn đến với F # và để lập trình. Tôi đã sửa định dạng câu hỏi của bạn. Nếu bạn nhấp vào liên kết "đã chỉnh sửa ... trước đây" ở trên, bạn có thể thấy những gì tôi đã thay đổi để hiển thị chính xác. Lần sau, sử dụng nút mẫu mã trong trình chỉnh sửa cho các khối mã. Biểu tượng trông giống như thế này '{}' – TheQuickBrownFox

+0

Cảm ơn bạn rất nhiều aloisdg! Tôi chắc chắn sẽ nhớ định dạng mã của tôi lần sau và cảm ơn bạn rất nhiều vì đã sửa nó cho tôi và để trả lời! –

Trả lời

6

Chú ý rằng bạn có thể phù hợp hơn hai giá trị bằng cách viết chúng trong một tuple và thay vì để ràng buộc danh sách đầu và đuôi bạn có thể sử dụng mẫu phù hợp trên 'hình dạng' của danh sách trực tiếp trong các vệ sĩ mặc dù thực tế là cùng một tên nó được sử dụng cho toàn bộ danh sách và sau đó cho đuôi là một chút không may vì nó có thể dẫn đến nhầm lẫn, nhưng nó hoạt động tốt vì F # đổ bóng các giá trị:

let rec merge xs ys = 
    match (xs, ys) with 
    | [], _ -> ys 
    | _, [] -> xs 
    | x::xs, y::ys -> 
     if x < y then x :: merge xs (y::ys) 
     else y :: merge (x::xs) ys 

let rec msort xs = 
    let sz = List.length xs 
    match sz with 
    | sz when sz < 2 -> xs 
    |_ -> 
     let n = sz/2 
     let ys = xs. [0..n-1] 
     let zs = xs.[n..sz-1] 
     merge (msort ys) (msort zs) 

Bạn đã bỏ lỡ từ khóa when trong điều kiện của các vệ sĩ. Tôi cũng đã sửa một số chi tiết nhỏ trong mã ban đầu của bạn.

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