2011-09-28 4 views
0

[1,2,3,4,5] 과 같은 목록을 전달하고 [[1,2,3,4,5], [2,3,4,5], [3,4,5], [4,5], [5], []]목록과 함께 작동하는 재귀 함수를 얻을 수 없습니다.

내 접근 방식은 재귀를 사용하여 목록이 올 때까지 drop 1 list을 다른 빈 목록에 추가합니다. 빈. 하지만 내 재귀가 올바르게 작동하는 것처럼 보일 수 없습니다.

도와 줘요, 덕분에 지금까지

내 코드 :

test a = test2 a where 
test2 a | size(a) > 1 = test (drop 1 a):[] 
     | otherwise = [] 

하지만, 재귀, 목록에 다시 목록을 목록을하지 통과하기 때문에 그 일을 wouldnt. 나는 당신이 그것을 무언가에 어떻게 할당 할 수 있는지를 이해할 수 없다.

+4

입니다 쓸 수 있을까? 우리가 처음에 한 일을 볼 수 없다면 우리가 잘못하고있는 것을 말할 수는 없다. –

+0

내가 잘못 생각할 수도 있기 때문에 내가 잘못했을 수도 있지만 내가 원하는 경우를 확인해야한다고 생각한다. 원래 목록을 인쇄하십시오. – rohit89

답변

7

우선 무엇을 test a = test2 a에 대해 수행 했습니까? 실제로 그것을 만들

당신이 경비를 사용하여 주장하는 경우
test [] = [[]] 
test (a:al) = (a:al):(test al) 

, 당신은 여전히 ​​필요합니까 :

그런 다음 패턴 매칭 함께 할, 이에 대한 경비 필요가 없습니다 (그리고 사용하지 마십시오) 목록의 목록 :

test a 
    | null a = [[]] 
    | otherwise = a:(test $ tail a) 

(목록 없음 목록 목록의 , 내 원래의 게시물에 한으로 ...)

+0

헬퍼 함수를 ​​사용하여 다른 접근 방식을 시도했지만이 경우에는 필요하지 않습니다. 감사! –

+0

그 마지막 줄은'a : (test (tail a))'이어야합니다 - 입력 목록 'a'는 새로운 싱글 톤 목록으로 캡슐화되어서는 안된다는 것을 알아 두십시오. –

+0

@ ThomasM.DuBuisson 당신은 당연합니다. 고마워요. 편집 됨. – leftaroundabout

0
fromNet [] = [[]] 
fromNet lst = lst : fromNet (tail lst) 
1

당신이 당신의 drop 1 접근 방식으로 가고 싶은 경우

test xs = take (1 + length xs) $ iterate (drop 1) xs 

약간 재미 버전은 코드의

import Data.List 

test = (++[[]]) . transpose . zipWith replicate [1..] 
관련 문제