2017-01-26 2 views
2

아래 주어진 템플릿을 사용하여 학교 과제에 List.Max를 사용하지 않고 목록에서 최대 요소를 찾으려고합니다.패턴 일치 및 재귀를 사용하여 목록에서 최대 요소 찾기 F #

 let findMax l = 
     let rec helper(l,m) = failwith "Not implemented" 

     match l with 
     | [] -> failwith "Error -- empty list" 
     | (x::xs) -> helper(xs,x) 

내가 생각할 수있는 문제에 대한 유일한 해결책, 기압

 let rec max_value1 l = 
      match l with 
      |[] -> failwith "Empty List" 
      |[x] -> x 
      |(x::y::xs) -> if x<y then max_value1 (y::xs) 
       else max_value1 (x::xs) 

     max_value1 [1; 17; 3; 6; 1; 8; 3; 11; 6; 5; 9];;  

내가 템플릿을 사용 하나에 내장 된 함수에서 갈 수있는 방법이 무엇입니까? 감사!

+2

[두 개의 인수를 사용하는 함수로 목록에서 최대 값을 얻으려면 어떻게합니까?] (http://stackoverflow.com/questions/13474382/how-do-i-get-the-max) -value-from-a-list-with-a-function-that-takes-two-arguments) –

답변

4

작업을 수행해야합니다 귀하의 도우미 함수는 외부 함수를 그냥 목록이 비어 있지 않은지 확인하고 그렇지 않은 경우,이 같은되어야 도우미, 전화 :

let rec helper (l,m) = 
    match (l, m) with 
    | [] , m -> m 
    | x::xs, m -> helper (xs, max m x) 

주, 당신이 그 당신은 함수의 마지막 인수에 대해 일치하고 있기 때문에 당신은 그것을 제거하고 function 대신 withmatch로 사용할 수 있습니다 : 당신은 모두에 합격하거나, 단순히 도우미 함수 I를 적용 할 튜플에 갈 수

let rec helper = function 
    | [] , m -> m 
    | x::xs, m -> helper (xs, max m x) 
1

n (빈 목록 가드 절 대신) 기본 일치. 나는이 질문을 미래에 발견 할 수 있고 분명한 대답이없는 사람에게 대답을 포함시키고있다. 배 사용

let findMax l = 
    let rec walk maxValue = function 
     | [] -> maxValue 
     | (x::xs) -> walk (if x > maxValue then x else maxValue) xs 
    match l with 
    | [] -> failwith "Empty list" 
    | (head::tail) -> walk head tail 

findMax [1; 12; 3; ] //12 

:

let findMax l = l |> List.fold (fun maxValue x -> if x > maxValue then x else maxValue) (List.head l) 
3
let findMax l = 
    let rec helper(l,m) = 
    match l with 
    | [] -> m 
    | (x::xs) -> helper(xs, if (Some x > m) then Some x else m) 
    helper (l,None) 

예 :

[-2;-6;-1;-9;-56;-3] |> findMax 
val it : int option = Some -1 

빈 목록이 없음을 반환하지 않습니다.

0

귀하의 동등한 규정이 정확히 무엇인지는 모르지만 목록의 최대 값은 실제로는 List.reduce max입니다. 따라서

let listMax : int list -> int = List.reduce max 

유형 검사기를 사용하려면 유형 주석이 필요합니다.

let inline listMax xs = List.reduce max xs 

도 작동하며 일반적이므로 예 : 수레 및 현뿐만 아니라.