1
나는 그 안에 9 개의리스트가있는 매트릭스를 가지고 있습니다. 내 매트릭스의 시각적 표현은 스도쿠입니다.리스트 목록에서 재귀 사용하기
나는 스도쿠의 각 상자 (3 × 3)의 숫자 (또는 요소)을 반환해야합니다. 는 예를 들어,이 그림에서 처음 세 행은
rows =
[[Just 8, Nothing, Nothing, Just 4, Nothing, Just 6, Nothing, Nothing, Just 7],
[Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 4, Nothing, Nothing],
[Nothing, Just 1, Nothing, Nothing, Nothing, Nothing, Just 6, Just 5, Nothing]]
와 내가 내 기능 (전체 스도쿠에 대한 나중에와) 첫 번째 상자에 대한 반환하고자하는
[[Just 8, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 1, Nothing], ...]
같이 표현 될 것이다
제 시도는 다음과 같습니다 : 처음 세 개의 목록에서 처음 세 요소를 가져 와서 반환하는 함수를 만들었습니다.
getEm :: [[a]] -> [a]
getEm x = concatMap (take 3)(take 3 x)
는 그때 처음 세 목록
dropEm :: Eq a => [a] -> [a]
dropEm x = delete itemZ listTwo
where
listOne = delete itemX x
listTwo = delete itemY listOne
itemX = (x!!0)
itemY = (x!!3)
itemZ = (x!!6)`
여기
내가 함께 붙어하고있는 부분입니다
에서 처음 세 개의 요소를 제거 할 다른 기능을 만들었습니다. 내 목표는 행렬을 사용하는 재귀 함수를 작성한 후getEm
을 사용하여 처음 세 개의 목록 (상자)의 처음 세 요소를 가져와 새 목록
finalList
에 추가하는 것입니다. 그런 다음 함수
dropEm
은 첫 번째 상자 (처음 세 목록의 처음 세 요소)를 제거한 다음 목록이 비어 있고 처리 할 "상자"가 없을 때까지 전체 프로세스를 반복합니다. 프로세스가 완료되면 함수는
finalList
을 반환합니다.
다음은 내가 작성한 기능이지만 작성한 두 가지 기능으로 재귀 부분을 구현하는 방법을 이해하지 못합니다.
boxs m = case startList of
[] -> finalList
where
startList = (chunksOf 3 (concat m))
finalList = []
첫 번째 사각형 인 'concatMap (take 3) (3 행 가져 오기)'을 시도해보십시오. –
@ n.m. 그것은 작동하지만, 그것은 단지 첫 번째 사각형입니다. 나머지 칸을 재귀 적으로 구하는 방법은 모두 하나의 목록에 포함됩니다. – 0248881
정말 그렇게하고 싶습니까? 궁극적으로 상자 목록을 얻으려면 간단한 방법이 있습니다. 임의의 박스를 얻으려면,'drop' 함수를 사용하는 것이 좋습니다. –