2012-11-04 2 views
2

목록에서 인수 a (0)을 인수 b (1)로 대체하는 함수를 (재귀 적으로) 어떻게 수행 할 수 있습니까? 예 :함수 대체

substitute 0 1 [1,0,3,0,4,0,0] 
    [1,1,3,1,4,1,1] 

감사합니다.

답변

5

가장 간단한 지능형리스트를 사용하는 것입니다.

하지만 그건 재귀가 아닙니다.

subst a b [] = [] 
subst a b (x:xs) 
    | x==a  = b:subst a b xs 
    | otherwise = x:subst a b xs 

foldr (또는 map) 패턴의 예이다 :

subst a b = foldr (\x xs-> (if x==a then b else x) : xs) [] 
subst a b = map (\x -> if x==a then b else x  ) 

그것은 통상 바람직하다 재귀, 그리스트 구조에 대한 케이스 분석 (즉, 구조 재귀) 그냥

subst a b xs = go xs 
    where 
    go [] = [] 
    go (x:xs) 
     | x==a  = b:go xs 
     | otherwise = x:go xs 

을하지만 잠시 그것을 응시하는 경우는 다음과임을 인식 :과 같이, 재귀 정의에서 "노동자"기능을 사용하여 s map 패턴. 하스켈에서 재귀 패턴은 map, filter

과 같은 고차 함수에 의해 캡쳐됩니다.
6

재귀가 필요하지 않습니다! 이 숙제 인 경우

substitute :: Eq a => a -> a -> [a] -> [a] 
substitute old new = map subs where 
    subs x | x == old = new 
      | otherwise = x 

, 당신은 쉽게 (재귀 임) definition of map에 대체 할 수 있습니다.

subst a b xs = [c | x<-xs, let c=if x==a then b else x] :