2013-02-13 4 views
0

나는 0에서 내부 [A], 시작의 인덱스를 반환하거나 반환 -1이 발견되어 있지 않은 경우 매개 변수 하스켈 - 기본 꼬리 재귀

whatIndex :: (Eq a) => a -> [a] -> Integer 

이있는 기능을 가지고있다. 이것은 내가 작성한 것입니다.

module WhatIndex where 

whatIndex :: (Eq a) => a -> [a] -> Integer 

whatIndex p [] = -1 

whatIndex p (a:as) 
    | p==a = index 
    | otherwise = whatIndex p as 
    where index = 1+whatIndex p as 

분명히 여기에서 색인을 올바르게 올리지 않았습니다. 왜 이것이 작동하지 않는가? 또한 매개 변수를 변경할 수 없습니다. 여기 ========================

whatIndex 3 [] = -1 
whatIndex 2 [1,2,3,2,1]=1 
whatIndex 1 [1,2,3,2,1]=0 
whatIndex 'b' ['a' .. 'z']=1 
+0

이것은 무엇을해야합니까? 테스트 케이스 또는 2를 제공 할 수 있습니까? – jozefg

+0

내가 생각하는 배열에 대한 표준. 인덱스() 함수. 나는 이것이리스트 내의 요소의 인덱스를 반환 할 것으로 기대하고 있다고 생각합니다 : whatIndex 17 [1,2,3,4,5,15,16,17,19] = 7 –

+0

예, 기본적으로 색인 기능. 색인을 늘리는 방법에 대한 논리를 파악할 수없는 것 같습니다. – Soulzityr

답변

3

는 누산기를 사용하여 시도 기본적인 입력/출력 매개 변수는 꼬리 재귀하려는 경우 :

whatIndex :: (Eq a) => a -> [a] -> Integer 
whatIndex = 
    let whatIndex' count p [] = -1 
     whatIndex' count p (a:as) 
     | p==a = count 
     | otherwise = whatIndex' (count + 1) p as 
    in whatIndex' 0 
+0

메소드에 허용되는 것보다 많은 매개 변수가 있습니다. 정수가 없습니다 -> a -> [a], 그냥 a -> [a] – Soulzityr

+1

@Soulzityr 아니요. 로컬 함수에만 해당됩니다. – Pubby

+0

Eclipse 플러그인을 사용하여 모듈을 작성하므로 let 또는 키워드를 사용하지 않아야합니다. 그렇게하는 방법이 바뀌 었습니까? – Soulzityr

5

1+whatIndex p as 그들에게 남아있는 목록의 모든 통해 이동 계산됩니다, 그것은 당신에게 인덱스를 제공하지 않습니다. 다음과 같은 반복적 인 도우미 함수를 사용하십시오.

여기에있는 로컬 함수 또는 해제 된 버전을 사용할 수 있습니다. 재귀 함수에서 "마지막"또는 "최종"함수 호출 함수에 어디

whatIndex p (x:xs) 
    | p == x = 0 
    | otherwise = 1 + whatIndex p xs 

꼬리 재귀 재귀 함수의 클래스를 의미한다 : 여기

whatIndex' :: (Eq a) => Integer -> a -> [a] -> Integer 

whatIndex' _ _ [] = -1 

whatIndex' i p (x:xs) 
    | p == x = i 
    | otherwise = whatIndex' (i+1) p xs 

whatIndex p xs = whatIndex' 0 p xs 

main = print $ whatIndex 'a' "bbbbaccc" 

가 아닌 꼬리 재귀 버전입니다 그 자체. 즉 함수가 "tail position"(함수 호출이 이루어지는 마지막 위치)에있는 다른 함수 (예 : +)를 호출하지 않는다는 의미입니다. whatIndex의 첫 번째 버전에서 호출 된 최종 함수는 whatIndex이고 두 번째 버전 (매개 변수로 whatIndex을 호출 함)에서 호출 된 최종 함수는 +입니다.

http://en.wikipedia.org/wiki/Tail_call

편집 : 그것은 조금 복잡하고 비효율적 있지만 여기에 귀하의 사양에 더 밀접하게 대응하는 버전이 있습니다.

whatIndex p xs 
    | not (any (==p) xs) = -1 
    | otherwise = whatIndex' p xs where 
     whatIndex' p (x:xs) 
      | p == x = 0 
      | otherwise = 1 + whatIndex' p xs 
+0

나는 매개 변수를 변경할 수 없습니다. – Soulzityr

+0

이것은'whatIndex'의 매개 변수를 변경하지 않습니다. 로컬 함수가 최상위 범위로 들어간 것을 제외하고는 Pubby의 답과 완전히 같습니다. – Wes

+0

또한 귀하의 질문에 "꼬리 재귀"어떤 종류의 누적 매개 변수를 암시했다. 비 꼬리 재귀 버전을 원한다면이를 지정해야합니다. – Wes