'알고리즘/재귀'에 해당되는 글 4건

  1. 2014.05.15 [재귀] 계단 오르기
  2. 2014.05.15 [재귀] 유클리드 호제법
  3. 2014.05.15 [재귀] x의 y 거듭제곱
  4. 2014.05.15 [Doc.] 재귀 (recursion)

프로그램 명: upstair                                                                                                            제한시간: 1 초


최대 2 칸 까지 오를 수 있을 때 오르는 방법의 가짓수를 출력 하는 문제이다.

그림은 n 이 4 인 경우의 예 이다.

  • 1 - 2 - 3 - 4
  • 1 - 2 - 4
  • 1 - 3 - 4
  • 2 - 3 - 4
  • 2 - 4

입력

n 은 30 이하의 양의 정수이다.

출력

오를 수 있는 가짓 수를 출력한다.

입출력 예

입력

4

출력

5


[문제 풀이]

최대 2칸을 오를 수 있다는 것은, 한 번에 1칸 또는 2칸을 올라갈 수 있다는 뜻이다.

  • 1칸씩 올라가기 : 1 - 2 - 3 - 4
  • 1칸 - 1칸 - 2칸 : 1 - 2 - 4
  • 1칸 - 2칸 - 1칸 : 1 - 3 - 4
  • 2칸 - 1칸 - 1칸 : 2 - 3 - 4
  • 2칸씩 올라가기 : 2 - 4 
이렇게 입력받은 수(n)만큼 올라갈 수 있는 방법의 가짓 수를 출력하는 것이 목표이다.

[소스코드 설명]
stair()의 n은 목표 계단 높이, now는 현재 계단 높이를 말한다.
문제 풀이에서도 설명을 했듯이, 한 번에 1칸 또는 2칸을 올라갈 수 있다는 뜻이기 때문에 

1칸 올라가는 경우(stair(n, now + 1))와 2칸 올라가는 경우(stair(n, now + 2))를 모두 구해서
목표 계단 높이(n)과 같을 때까지 재귀 호출을 하였다.


'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 유클리드 호제법  (0) 2014.05.15
[재귀] x의 y 거듭제곱  (0) 2014.05.15
[Doc.] 재귀 (recursion)  (0) 2014.05.15
Posted by 밍쫑
,

프로그램 명: euclid

제한시간: 1 초

두 수를 입력받아 최대공약수,최소 공배수를 구하는 프로그램을 작성하시오.

입력

두 양의 정수 a , b 가 입력으로 주어진다. (1 <= a , b <= 100 000)

출력

최대공약수,최소공배수를 한 줄에 출력한다. 두 수의 최대공약수 와 최소 공배수는 정수 범위(2^31 - 1)를 넘지 않는다.

입출력 예

입력

8 12

출력

4 24


[문제 풀이]


유클리드 호제법

유클리드 호제법(- 互除法, Euclidean algorithm)은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 

- Wiki, 위키백과 -


1. 입력으로 두 수 m,n(m>n)이 들어온다.

2. n이 0이라면, m을 출력하고 알고리즘을 종료한다.

3. n이 m을 나누어 떨어지면, n을 출력하고 알고리즘을 종료한다.

4. 그렇지 않으면, m을 n으로 나눈 나머지를 새롭게 m에 대입하고, m과 n을 바꾸고 3으로 돌아온다.


최소공배수(lcm) = (A*B) / gcd(A, B);




'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 계단 오르기  (0) 2014.05.15
[재귀] x의 y 거듭제곱  (0) 2014.05.15
[Doc.] 재귀 (recursion)  (0) 2014.05.15
Posted by 밍쫑
,

프로그램 명: powerofx

제한시간: 1 초

x 의 y 거듭제곱을 구하는 문제이다.

2 10 을 입력 받으면 2 의 10 거듭제곱 1024 가 출력되어야 한다.

2^10 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2=1024

입력

두 정수 x , y 가 입력된다.

출력

x 의 y 거듭제곱된 결과값을 출력한다.

출력 결과는 정수 범위( 2^31 - 1)를 넘지 않는다.

입출력 예

입력

2 10

출력

1024


[소스코드 풀이]

지수(y)의 숫자 만큼 밑수(x)를 곱하기 때문에, y가 1이 될 때까지 재귀적으로 함수를 호출해서 밑수를 계속 곱해준다.



'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 계단 오르기  (0) 2014.05.15
[재귀] 유클리드 호제법  (0) 2014.05.15
[Doc.] 재귀 (recursion)  (0) 2014.05.15
Posted by 밍쫑
,

재귀(Recursion)


수학이나 컴퓨터 과학 등에서 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻한다. 주로 이 방법은 함수에 적용한 재귀 함수(Recursion Function)의 형태로 많이 사용된다.

-  Wiki, 위키 백과 -




특징

  • 구현하려는 알고리즘 자체가 재귀적 특성을 갖는다면, 재귀 함수를 이용하면 쉽게 구현이 가능하다.
  • 프로그램 내의 반복문은 재귀호출로 바꿀 수 있으며, 그 반대로 재귀호출은 반복문으로 고쳐 쓸 수 있다.
  • 일반적으로 재귀 함수는 반복문을 이용한 함수로 변환이 가능


long factorial(int number)

{

...

factorial(number - 1);    // 함수 내부에서 자기 자신의 함수를 호출 (재귀함수)

...

}





n!

    • 수식 n! (n factorial)은 1 * 2 * 3 * ... * (n-2) * (n-1) * n 을 의미

계승 수식은 재귀적 특성을 갖음

    • 즉 n!을 구하기 위해서 (n-1)!을 먼저 구한다면 쉽게 n!을 구할 수 있음
    • 그러나 재귀적 호출이 종료되는 조건이 없다면 무한 호출에 의해 문제가 발생
if (n<=1)
n! = 1
else
n! = n * (n-1)!

long factorial(int number)

{

if (number <= 1)

return 1;

else

return (number * fatorial (number -1));

}





피보나치 수

  • 다음 수가 앞의 두 수의 합이 되는 수열

0    1    1    2    3    5    8    13    21    ...

  • n번째 수를 Fn이라 하면, Fn은 다음과 같이 재귀적으로 표현

  • 피초나치 수를 발생시키는 프로그램을 작성한다면 재귀적 특성을 이용하여 쉽게 구현 가능.

int fibo(int n)

{

if (n==0)    return 0;

else if (n==1)    return 1;

else    return return fibo(n-1) + fibo(n-2);

}


main()

{

printf("%d", fibo(4));

}



  • 반복적 방법을 이용하여 구현

long fibo (int n)

{

int fn, fn1, fn2;

int i;


if (n <=1)    return n;

else {

fn2 = 0;

fn1 = 1;

for (i=2; i<=n; i++) {

fn = fn1 + fn2;

fn2 = fn1;

fn1 = fn;

}

return fn;

}

}



팩토리얼 문제나 피보나치 수열 문제 말고도 재귀를 대표하는 문제들을 많이 있습니다. (ex. 하노이의 탑)

'알고리즘 > 재귀' 카테고리의 다른 글

[재귀] 계단 오르기  (0) 2014.05.15
[재귀] 유클리드 호제법  (0) 2014.05.15
[재귀] x의 y 거듭제곱  (0) 2014.05.15
Posted by 밍쫑
,