JAVA

재귀 함수

하나의 메소드에서 자신을 다시 호출하여 작업을 수행하는 방식으로 주어진 문제를 푸는 방법이다. 재귀 호출이나 되부름 이라고 불리기도 한다.

 

  • 메소드 정의 내에 같은 이름의 함수가 올때 이를 재귀함수라 부른다.
  • 반드시 탈출조건이 있어야 stack overflow를 방지할 수 있다.
  • 같은 행위가 반복될 때 재귀메소드를 사용한다,

 

가장 간단한 예를 들자면 팩토리얼을 구하는 프로그램을 재귀호출을 이용해서 구현할 수 있다.


public class Factorial
{
	public static void main(String[] args)
    {
    	int input = 4;
        
        System.out.println(fact(input));
    }
    
    public static int fact(int n)
    {
    	if(n<=1)
        	return n;
        else
            return fact(n-1) * n
    }    
}
// 실행 결과
/*
24
*/

factorial을 구하는 재귀 알고리즘

 

이 개념을 이용하여 정해진 횟수만큼 Hi!를 출력하는 프로그램을 구현하면 아래와 같다.


public class Test069
{
	public static void main(String[] args)
	{
		showHi(5);
	}

	public static void showHi(int cnt)
	{
		System.out.println("Hi!");
		if(cnt==1)
			return;
		showHi(--cnt);	
	}
}

 

실행 결과

// 실행 결과
/*
Hi!
Hi!
Hi!
Hi!
Hi!
*/

return문

return이란 명령어는 쉽게 생각해서 두가지로 사용되는걸로 생각할 수 있다.

 

1. 클래스내의 어떠한 메소드가 실행되고 해당 메소드 실행에 따라 나온 값을 호출한 곳에서 돌려받고자 할때

(값의 반환)

 

2. 해당 메소드 실행중 특정 조건에 따라 해당 메소드의 진행을 멈추고 빠져나올때

(메소드의 종료)

 

제어문에서의 return문은 메소드의 종료를 뜻한다.

 

예시에서 return문의 사용을 살펴보자면 아래와 같다.


import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class Test068
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n, s;

		System.out.print("임의의 정수 입력(10 이상) : ");
		n = Integer.parseInt(br.readLine());

		if(n<10)
		{
			System.out.println("10 이상의 정수를 입력해야 합니다.");
			return;
			//-- 메소드 종료 → main() 메소드 종료 → 프로그램 종료
		}

		s = 0;
		for(int i=1; i<=n; i++)
			s+=i;

		System.out.println("결과 : " + s);
	}
}

 

실행 결과

// 실행 결과

/*
임의의 정수 입력(10 이상) : 10
결과 : 55
계속하려면 아무 키나 누르십시오 . . .

임의의 정수 입력(10 이상) : 2
10 이상의 정수를 입력해야 합니다.
계속하려면 아무 키나 누르십시오 . . .
*/

continue문

break문과 같이 제어문의 일종이다. 자신이 포함된 반복문의 끝으로 이동한다(다음 반복으로 넘어간다.)

즉, continue문 이후의 문장들을 무시하고 다음 루프를 수행한다.



※ continue 구문을 활용하여 다음과 같이 출력될 수 있도록 프로그램을 구현한다. 

 실행 예) 

1 : 1 
3 : 4 
5 : 9 
   : 

99 : 2500 
계속하려면 아무 키나 누르세요...



public class Test067
{
	public static void main(String[] args)
	{
		int n=0, s=0;
		while(n<100)
		{
			n++;
		
			if(n % 2 == 0)	//-- 짝수라면...
				continue;	//-- ( + 뒷부분 무시하고...)계속하라...

			s += n;								//-- 뒷부분
			System.out.println(n + " : " + s);	//-- 뒷부분
		}
	}

}

실행 결과

// 실행 결과
/*
1 : 1
3 : 4
5 : 9
7 : 16
9 : 25
11 : 36
13 : 49
15 : 64
17 : 81
19 : 100
21 : 121
23 : 144
25 : 169
27 : 196
29 : 225
31 : 256
33 : 289
35 : 324
37 : 361
39 : 400
41 : 441
43 : 484
45 : 529
47 : 576
49 : 625
51 : 676
53 : 729
55 : 784
57 : 841
59 : 900
61 : 961
63 : 1024
65 : 1089
67 : 1156
69 : 1225
71 : 1296
73 : 1369
75 : 1444
77 : 1521
79 : 1600
81 : 1681
83 : 1764
85 : 1849
87 : 1936
89 : 2025
91 : 2116
93 : 2209
95 : 2304
97 : 2401
99 : 2500
계속하려면 아무 키나 누르십시오 . . .
*/

break 문

break는 반복문이나 조건문, 즉 제어문들에게서 벗어날때 사용한다. 

 

각 제어문들에 대한 예는 아래와 같다.

 

break 문은 중첩된 반복문 안에서도 사용할 수 있다.

하지만 그럴 경우에 가장 안쪽에 있는 반복문만 빠져나가게 된다.


if문

if( 참이냐 )
{
      if( 참이냐 )
      {
            명령문;
            break;
      }
     else
          명령문2;
}


▷ else 를 사용하지 않아도 명령문2을 수행하지 않습니다.      

 

 

for문                           

for(int i=0; i<100; ++i)
{
       if( i == 50 )
           break;
     
      명령문;
}

▷ i가 50이 되면 강제로 for문을 빠져나옵니다.

 

 

while문                            

int i =0;
while( 참 )
{
      ++i;
      if( i == 50 )
          break;
}

 

▷ i가 50이 되면 강제로 while문을 빠져나옵니다.

 

 

switch문                              

switch(정수식)
{
       case 상수1:   명령문1:   break;
       case 상수2:   명령문2:   break;
}

 

▷ 알맞은 상수에 맞추어 명령문을 실행후 switch문을 빠져 나옵니다.


※ 다음과 같은 처리가 이루어지는 프로그램을 구현한다. 단, 입력받는 정수는 1~100 범위 안에서만 가능하도록 처리한다.

 실행 예)
 임의의 정수 입력 : -10

 임의의 정수 입력 : 0

 임의의 정수 입력 : 2020

 임의의 정수 입력 : 10
 >> 1 ~ 10 까지의 합 : 55
 계속하시겠습니끼(Y/N)? : y

 임의의 정수 입력 : 100
 >> 1 ~ 100 까지의 합 : 5050
 계속하시겠습니끼(Y/N)? : N
 계속하시려면 아무 키나 누르세요.... → 프로그램 종료


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test066
{
	public static void main(String[] args) throws IOException
	{
		// BufferedReader 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n, s, i;
		//-- n : 외부로부터 사용자의 입력값을 담아둘 변수
		//	 s : 누적합 연산 결과를 담아둘 변수
		//	 i : 1부터 1씩 사용자의 입력값까지 증가할 변수

		char ch;
		//-- 프로세스를 계속 진행할지의 여부를 담아둘 변수
		//	 (Y / y / N / n)
		
		while(true)
		{
			do
			{
				System.out.print("\n임의의 정수 입력 : ");
				n = Integer.parseInt(br.readLine());
			}
			while (n<1 || n>100);

			s = 0;		//-- 누적합을 담아낼 변수 초기화 → 위치 check~!!!

			for(i=1; i<=n; i++)
				s += i;

			System.out.printf(">> 1 ~ %d 까지의 합 : %d\n", n, s);
			
			System.out.print("계속하시겠습니끼(Y/N)?");
			ch = (char)System.in.read();
			// y + enter(\r\n)


			// 그만할래~!!! 의사표현
			//ch == 'N'	|| ch == 'n'
			if(ch != 'Y' && ch != 'y')	// 논리 연산자 check~!!!
			{
				// 반복문(while)을 빠져나갈 수 있는 코드 작성 필요
				//-- 위와 같은 의사표현을 했다면
				//   그동안 수행했던 반복문을 멈추고 빠져나가야 한다.
				break;
				//-- 멈춘다. ( + 그리고 빠져나간다.) check~!!!
			}
			
			// 엔터값(\r\n) 처리
			System.in.skip(2);


		}//while_end


	}//main()_end


}//class_end

 

실행 결과

 

// 실행 결과
/*
임의의 정수 입력 : 151

임의의 정수 입력 : 121

임의의 정수 입력 : 50
>> 1 ~ 50 까지의 합 : 1275
계속하시겠습니끼(Y/N)?Y

임의의 정수 입력 : 11
>> 1 ~ 11 까지의 합 : 66
계속하시겠습니끼(Y/N)?
*/

※ 다음과 같은 내용이 출력될 수 있도록 반복문의 중첩 구문을 작성하여 프로그램을 구현한다.


 실행 예) 

    *
   **
  ***
 ****
*****

 

public class Test061
{
	public static void main(String[] args)
	{
		int i,j,k;

		for(i = 1; i <= 5; i++)
		{
			for(j = i; j < 5; j++)
			{
				System.out.printf(" ");
			}
			for(k = i; k > 0; k--)
			{
				System.out.printf("*");
			}
			System.out.println();
		}
	}
}
// 실행 결과
/*
    *
   **
  ***
 ****
*****
계속하려면 아무 키나 누르십시오 . . .
*/

 

 실행 예)

    *        //공백 4   //*1
   ***       //공백 3   //*3
  *****      //공백 2   //*5
 *******     //공백 1   //*7
*********    //공백 0   //*9

public class Test062
{
	public static void main(String[] args)
	{
		int i,j,k;

		for(i = 1; i <= 5; i++)
		{
			for(j = 5 - i; j >= 0; j--)
			{
				System.out.printf(" ");
			}

			for(k = 2*i-1; k > 0 ; k--)
			{
				System.out.printf("*");
			}
			System.out.println();
		}
	}
}

// 실행 결과
/*
     *
    ***
   *****
  *******
 *********
계속하려면 아무 키나 누르십시오 . . .
*/

 

 실행 예)

*********       //공백 0  //*9
 *******         //공백 1  //*7
  *****          //공백 2  //*5
   ***            //공백 3  //*3
    *              //공백 4  //*1

public class Test063
{
	public static void main(String[] args)
	{
		int i,j,k;

		for(i = 1; i <= 5; i++)
		{
			for(j = i-1; j >= 0; j--)
			{
				System.out.printf(" ");
			}
			for(k = (2*i)-1; k < 10; k++)
			{
				System.out.printf("*");				
			}
			System.out.printf("\n");
		}
				
		
	}
}

// 실행 결과
/*
 *********
  *******
   *****
    ***
     *
계속하려면 아무 키나 누르십시오 . . .
*/

 실행 예)

*********
 *******
  *****
   ***
    *
    *
   ***
  *****
 *******
*********

public class Test064
{
	public static void main(String[] args)
	{
		int i,j,k;

		for(i = 1; i <= 5; i++)
		{
			for(j = i - 1; j >= 0; j--)
			{
				System.out.printf(" ");
			}
			for(k = (2*i)-1; k < 10; k++)
			{
				System.out.printf("*");				
			}
			System.out.printf("\n");
		}
		for(i = 1; i <= 5; i++)
		{
			for(j = 5 - i; j >= 0; j--)
			{
				System.out.printf(" ");
			}

			for(k = 2*i-1; k > 0 ; k--)
			{
				System.out.printf("*");
			}
			System.out.println();
		}
	}
}

// 실행 결과
/*
 *********
  *******
   *****
    ***
     *
     *
    ***
   *****
  *******
 *********
계속하려면 아무 키나 누르십시오 . . .
*/

 실행 예)
 

    *        //공백 4  //* 1
   ***       //공백 3  //* 3
  *****      //공백 2  //* 5
 *******     //공백 1  //* 7
*********    //공백 0  //* 9
 *******      //공백 1  //* 7
  *****        //공백 2  //* 5
   ***         //공백 3  //* 3
    *          //공백 4  //* 1

 

public class Test065
{
	public static void main(String[] args)
	{
		int i,j,k;
		
		for(i = 1; i <= 5; i++)
		{
			for(j = 5 - i; j >= 0; j--)
			{
				System.out.printf(" ");
			}

			for(k = 2*i-1; k > 0 ; k--)
			{
				System.out.printf("*");
			}
			System.out.println();
		}

		for(i = 1; i <= 5; i++)
		{
			for(j = i-1; j >= 0; j--)
			{
				System.out.printf(" ");
			}
			for(k = (2*i)-1; k < 10; k++)
			{
				System.out.printf("*");				
			}
			System.out.printf("\n");
		}
	}
}

// 실행 결과
/*
     *
    ***
   *****
  *******
 *********
 *********
  *******
   *****
    ***
     *
계속하려면 아무 키나 누르십시오 . . .
*/

Test060 반복문의 중첩(3)

2020. 9. 4. 13:35

※ 반복문을 중첩하여 아래의 구구단을 구현하라.

 

실행 예)

2 * 1 =  2    3 * 1 =  3    4 * 1 =  4   5 * 1 =  5
2 * 2 =  4    3 * 2 =  6    4 * 2 =  8   5 * 2 = 10
  :                 :                :                :
2 * 9 = 18   3 * 9 = 27   4 * 9 = 36   5 * 9 = 45


6 * 1 =  6    7 * 1 =  7   8 * 1 =  8    9 * 1 =  9
6 * 2 = 12   7 * 2 = 14   8 * 2 = 16   9 * 2 = 18
   :                :                :                :
6 * 9 = 54   7 * 9 = 63   8 * 9 = 72   9 * 9 = 81


public class Test060
{
	public static void main(String[] args)
	{
		for (int h = 0; h <= 1; h++ )			// 문단 구성	   → 1 2
		{
			for(int i = 1; i <= 9; i++)		// 곱해지는 수 구성 → 1 2 3 4 5 6 7 8 9
			{
				for(int j = 2; j <= 5; j++)	// 단 구성	   → 2 3 4 5 6 7 8 9
				{
					System.out.printf("%4d * %d = %2d",j+h*4,i,((j+h*4)*i));
				}
				System.out.println();
			}
			System.out.println();
		}
	}
}

// 실행 결과
/*
   2 * 1 =  2   3 * 1 =  3   4 * 1 =  4   5 * 1 =  5
   2 * 2 =  4   3 * 2 =  6   4 * 2 =  8   5 * 2 = 10
   2 * 3 =  6   3 * 3 =  9   4 * 3 = 12   5 * 3 = 15
   2 * 4 =  8   3 * 4 = 12   4 * 4 = 16   5 * 4 = 20
   2 * 5 = 10   3 * 5 = 15   4 * 5 = 20   5 * 5 = 25
   2 * 6 = 12   3 * 6 = 18   4 * 6 = 24   5 * 6 = 30
   2 * 7 = 14   3 * 7 = 21   4 * 7 = 28   5 * 7 = 35
   2 * 8 = 16   3 * 8 = 24   4 * 8 = 32   5 * 8 = 40
   2 * 9 = 18   3 * 9 = 27   4 * 9 = 36   5 * 9 = 45

   6 * 1 =  6   7 * 1 =  7   8 * 1 =  8   9 * 1 =  9
   6 * 2 = 12   7 * 2 = 14   8 * 2 = 16   9 * 2 = 18
   6 * 3 = 18   7 * 3 = 21   8 * 3 = 24   9 * 3 = 27
   6 * 4 = 24   7 * 4 = 28   8 * 4 = 32   9 * 4 = 36
   6 * 5 = 30   7 * 5 = 35   8 * 5 = 40   9 * 5 = 45
   6 * 6 = 36   7 * 6 = 42   8 * 6 = 48   9 * 6 = 54
   6 * 7 = 42   7 * 7 = 49   8 * 7 = 56   9 * 7 = 63
   6 * 8 = 48   7 * 8 = 56   8 * 8 = 64   9 * 8 = 72
   6 * 9 = 54   7 * 9 = 63   8 * 9 = 72   9 * 9 = 81

계속하려면 아무 키나 누르십시오 . . .
*/

+ Recent posts