갤러리정
달팽이 배열은 (x좌표값 증가), (y좌표값 증가), (x좌표값 감소), (y좌표값 감소)의 패턴을 가지고 있다. 그리고 조금 더 자세히 보면 x, y좌표값이 증가하는 부분과 x, y좌표값이 감소하는 부분을 볼 수 있다. 이런 패턴을 재귀호출 함수를 사용해서 배열을 구현할 수 있다.
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
[재귀호출 함수를 만드는 방법]
1) 재귀호출이 끝나는 조건(종료 조건)을 정해주어야 한다. 종료 조건은 재귀호출 함수의 처음 부분에 코딩해야 한다. 그래야 이번 재귀호출을 수행할 것인가 말 것인가에 대한 결정을 할 수 있기 때문이다. 달팽이 배열에서의 종료 조건은 배열의 숫자가 16이 인쇄가 되면 끝내는 것이다.
2) 처리 작업을 수행한다. 달팽이 배열에서는 배열에 숫자를 집어넣는 일이 처리해야할 일이므로, 이에 대한 작업을 해준다.
3) 재귀호출을 한다. 현재 단계에서 처리해야할 작업이 끝났으므로 다음 작업을 위해서 재귀호출을 해준다. 달팽이 배열에서는 1~7까지 처리가 끝났다면 8~12까지의 작업을 처리하기 위해 재귀호출을 한다.
//num=카운트, x=열, y=행
public static int num = 0;
public static int x=-1;
public static int y=0;
public static void SnailArray03()
{
bool check = true;
int arrCnt = 0;
do
{
try
{
Console.Write("만들고 싶은 배열방의 크기를 정해주세요 : ");
arrCnt = checked(Convert.ToInt32(Console.ReadLine()));
check = false;
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}while(check);
int[,] array = new int[arrCnt,arrCnt];
//재귀호출
CircularArray(arrCnt, 1, ref array); //재귀함수의 초기값 설정
for(int i=0;i<array.GetLength(0); i++)
{
for(int j=0;j<array.GetLength(1);j++)
Console.Write("{0,3}", array[i,j]);
Console.WriteLine();
}
}
public static void CircularArray(int n, int direct, ref int[,] array)
//재귀호출함수, n=n차정방행렬, direct=행열방향에 대한 증가치, array=배열방
{
if(n!=0)
{
for(int i=0; i<(2*n-1); i++) //2*n-1개의 카운트를 채운다.
{
if(i < n)
x += direct; //열 방향으로 증가, 감소 한다
else
y += direct; //행 방향으로 증가, 감소 한다
array[y,x] = ++num;
}
CircularArray(n-1, direct * (-1), ref array); //방향을 바꾸어서 재귀호출을 한다.
}
}
[출처] [펌] [문제풀이] 달팽이 배열 - 재귀호출 사용|작성자 눈꽃천사