2016-12-05 1 views
4

숫자 목록에서 가장 작은 요소를 찾으려고합니다.상위 함수를 사용하는 목록에서 가장 작은 요소

명시 적으로 재귀를 사용할 때 사소한,하지만 내가

map처럼 단독으로 내장 된 고차 함수를 사용하여이 작업을 수행 할 수있는 방법을 찾고 있어요

filter,

foldr.

다른 말로하면, 나는이 기능들의 조합을 사용하여 내가 원하는 것을 얻고 싶습니다.

+0

지나치게 익숙하지를하지만 반복적으로 처음보다 작은 모든 요소를 ​​필터링 할 수 있습니다 목록 크기가 하나가 될 때까지 목록에 하나 있습니까? – gowrath

답변

1

foldr을 사용하십시오. 누산기는 + inf.0으로 시작합니다. combine-accumulator-and-element는 누적 기와 요소 중 가장 작은 것을 반환해야합니다.

+0

왜 foldr 대신 foldl을 권장하는지 궁금하십니까? foldl 사용과 비교하면 어떤 차이가 있습니까? – naomik

+0

나는 질문에서 언급 한 것과 같은 접기를 골랐다. 당신이 옳다 : foldl은이 경우 더 좋을 것이다. 왜냐하면'min'은 인수의 순서에 의존하지 않기 때문이다. – soegaard

+0

wups 나는 'foldl'이 더 낫다고 제안하는 것을 의미하지는 않았다. 나는 솔직히 모르겠다 때 다른 하나를 사용하는 것이 더 낫다 둘 다 동일한 반환 값을 얻을 때 – naomik

1

숫자 목록에서 가장 작은 요소를 찾으려고합니다.

확실한 방법은 당신이 당신의 자신의 min 절차를 구현해야하는 경우 내장 그러나 min

#lang racket 

(apply min '(5 2 3 6 4 0 9 -3 2 6)) 
;; => -3 

, foldl 당신을 도울 것이다 사용하는 것입니다. 또한이 프로 시저를 빈 목록에서 사용할 때 오류가 발생했습니다. 0 번 인수에 적용하려고하면 내장 된 min과 매우 유사합니다.

#lang racket 

(define (min xs) 
    (match xs 
    ((list x xs ...) (foldl (λ (x acc) (if (< x acc) x acc)) 
          x 
          xs)) 
    (_ (error 'min "must use non-empty list")))) 


(min '(5 2 3 6 4 0 9 -3 2 6)) 
;; => -3 

(min '()) 
;; => min: must use non-empty list 
0

한도 목록에서 '정렬'기능을 사용하고 정렬 된 목록의 첫 번째 요소 수행 할 수 있습니다 구성표와

(first (sort '(5 2 3 6 4 0 9 -3 2 6) <)) 
;; => -3 
관련 문제