2010-05-01 7 views
1

두 개의 인수를 취하는 함수를 작성하는 데 도움을주십시오 : int 및 인덱스 (int) 목록 및 테이블의 지정된 인덱스 위치에 음수 값이있는 정수 목록을 반환합니다.haskell 재귀 함수

이 함수의 서명은 MyReverse :: [Int]->Int->[Int]입니다.

예 : myReverse [1,2,3,4,5] 3 = [1,2,-3,4,5].

색인이 목록의 길이보다 크거나 0보다 작은 경우 동일한 목록을 반환하십시오.

+6

이 숙제 같은 냄새가 난다. 그렇다면 태그를 붙이십시오. –

+0

"reverse"는리스트에서 완전히 다른 연산을 의미하므로'itemInverse' (또는'inverseItem')가 더 나은 이름이 될 것입니다. – outis

+0

또는'negateItem'. 반전은 1/x을 의미 할 수 있습니다. – kennytm

답변

4
myReverse :: [Int] -> Int -> [Int] 
myReverse [] n = [] 
myReverse (x:xs) n 
| n < 0  = x:xs 
| n == 0 = (-x):xs 
| otherwise = x:(myReverse xs (n-1)) 

배열의 색인은 0입니다. 예는 1에서 색인을 생성하지만, n == 0의 경우에는 정의되지 않습니다. 1에서 인덱스로 가져 오는 수정 사항은 매우 분명해야합니다.

또한 대문자와 일치하지 않습니다. MyReversemyReverse과 다르며 후자 만 기능으로 유효합니다. GHCi에서

결과 : myReverse에 대한 무의미 정의를 사용하여, 같은 일을

*Main> myReverse [10,20,30,40,50] 0 
[-10,20,30,40,50] 
*Main> myReverse [10,20,30,40,50] 2 
[10,20,-30,40,50] 
*Main> myReverse [10,20,30,40,50] 3 
[10,20,30,-40,50] 
*Main> myReverse [10,20,30,40,50] 5 
[10,20,30,40,50] 
*Main> myReverse [10,20,30,40,50] (-1) 
[10,20,30,40,50] 

더 많은 일반 버전 :

myGeneric :: (a -> a) -> [a] -> Int -> [a] 
myGeneric f [] n = [] 
myGeneric f (x:xs) n 
| n < 0  = x:xs 
| n == 0 = (f x):xs 
| otherwise = x:(myGeneric f xs (n-1)) 

myReverse :: [Int] -> Int -> [Int] 
myReverse = myGeneric negate 
+0

덕분에 해결책이 부족했기 때문에 내 솔루션이 부족했습니다. (-x) : xs 도움을 주셔서 감사합니다. – gruber

+0

@snorlaks : 부분적인 해결책이 있다면 사람들은 항상 질문에 게시 해 주셔서 감사하며 문제가 있다고 생각한 곳에서 시도했습니다. –

-1
myReverse xs i = 
    let j = i - 1 
    in take j xs 
    ++ - (xs !! j) 
     : drop i xs 
+0

이것은 매우 비 관용적 인 하스켈이며 매우 비효율적입니다. – MtnViewMark

+0

Ohhh thats ttricku,하지만 흥미 롭다면, 그 예제를 나에게 설명해 주시겠습니까? 도움을 주셔서 감사합니다 – gruber

+0

let j = i -1은 변경해야 할 요소 바로 앞에있는 요소에 대한 색인을 제공합니다. take j xs 전에 요소 목록을 제공합니다 "++"는 목록 연결입니다 "!!" 인덱스가 ":"음수 값을 머리글에 놓습니다. i xs drop i xs는 첫 번째 요소가 제거 된 xs 목록입니다. 그래서 목록을 이전 부분으로 나눕니다. 부정 된 부분과 모든 부분을 모두 뒤쪽으로 붙입니다. – stonemetal