버블정렬 알고리즘
: 인접한 두 값를 비교하여 정렬하는 방법이다. 한쪽에서 다른 한쪽으로 크기를 비교, 교환해가면서 정렬한다. (오름차순 또는 내림차순)
{3, 2, 4, 1}
오름차순 정렬시 가장 큰 값을 배열의 마지막으로 먼저 보냄 (맨앞에서부터 순차적으로 3번의 비교)
swap이 일어나는 과정
|
1 2 3 4 |
재귀 함수
: 함수내에서 자기 다신을 다시 호출하는 함수
탈출조건을 구성하는 것이 중요
factorial - 재귀함수 활용 소스
factorial : 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것을 말하며 n!로 나타낸다.
0!=1, 1!=1
4! = 1x2x3x4 = 24
n factorial f(n)은 수식적으로 다음과 같이 표현
n이 0이면, f(n)=1
n이 1과 같거나 크면, f(n)=n X f(n-1)
factorial 함수를 소스로 옮기면 다음과 같다.
int Factorial(int n)
{
if(n == 0)
return 1;
else
return n * Factorial(n-1);
}
피보나치 수열
: 처음 두 항은 0과 1이 주어진 상태에서, 세 번째 항부터는 바로 앞의 두 항의 합이 된다
0, 1, 1, 2, 3, 5, 8, 13, 21...
수열의 n번째 값 = 수열의 n-1번째 값 + 수열의 n-2번째 값 (0과 1은 처음 주어진 수)
피보나치 수열의 수학적 수식 (n=1은 0, n=2는 1)
fib(n) = fib(n-1) + fib(n-2)
다음과 같이 재귀적 알고리즘에 의해 함수를 정의한다.
int Fibo(int n)
{
if(n ==1)
return 0; // n=1은 0 반환
else if(n == 2)
return 1; // n=2는 1 반환
else
return Fibo(n-1) + Fibo(n-2); // 피보나치 수학적 수식 그대로 계산후 반환
}
이진 탐색 알고리즘의 재귀적 구현
반복 패턴
1. 탐색 범위의 중앙에 목표값이 있는지 확인
2. 없다면 탐색범위를 반으로 줄여 다시 탐색
탐색 실패=재귀의 탈출 조건
first(탐색시작지점)가 last보다 커지는 경우, 즉 역전되는 경우는 값이 없음을 의미하고 재귀에서 탈출
if(first > last)
return -1 // 탐색 실패시 -1 반환
|
하노이 타워
위 풀이 과정은 원반이 4개인 하노이 타워에서도 아래와 같이 3단계의 패턴으로 간략화할 수 있다.
2,3개의 원반을 가지고 풀이하면 본질을 이해할 수 있다.
즉 가장 큰 원반을 옮기기위해선 그 위의 원반들을 A에서(from)
경유지를 통해(by) 목적지로(to) 옮기게 된다.
하노이타워 함수의 인자는 원반의 수 n과
위에서 적은것과 같이 from, by, to가 된다.
목적 : 큰 원반 n개를 A에서 C로 이동
HanoiTowerMove(n, from, by, to); // 원반의 번호는 위로갈수록 n-1, A, B, C
1. 작은 원반 n-1개를 A에서 B로 이동
HanoiTowerMove(n-1, from, to, by);
// A, C, B (C가 경유지가 됨)
2. 큰 원반 1개를 A에서 C로 이동
1개는 그대로 1개, printf( . . . . );
3. 작은 원반 n-1개를 B에서 C로 이동
HanoiTowerMove(n-1, by, from, to);
// B, A, C
함수의 호출순서가 잘 파악되지 않는다면 visual studio에서 "한단계식 코드 실행"을 하며 디버깅을 하는 것도 좋은 방법이다.
#include <stdio.h>
void HanoiTowerMove(int n, char from, char by, char to)
{
if(n==1) // 이동할 원반의 수가 1개라면
{
printf("원반1을 %c에서 %c로 이동 \n", from, to);
}
else
{
HanoiTowerMove(n-1, from, to, by); // 3단계 중 1단계
printf("원반%d을(를) %c에서 %c로 이동 \n", n, from, to); // 3단계 중 2단계
HanoiTowerMove(n-1, by, from, to); // 3단계 중 3단계
}
}
int main(void)
{
// 막대A의 원반 3개를 막대B를 경유하여 막대C로 옮기기
HanoiTowerMove(3, 'A', 'B', 'C');
return 0;
}
|
원반1을 A에서 C로 이동
원반2을(를) A에서 B로 이동
원반1을 C에서 B로 이동
원반3을(를) A에서 C로 이동
원반1을 B에서 A로 이동
원반2을(를) B에서 C로 이동
원반1을 A에서 C로 이동 |
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
2016-05-16_조재찬_업무일지_AVR 입출력/ C#기초 (0) | 2016.05.16 |
---|---|
칸 아카데미 암호학 강좌 (2) | 2016.05.14 |
아마존 딥러닝 라이브러리 DSSTNE 발표 (0) | 2016.05.14 |
2016-05-03_조재찬_스터디일지_C언어 기초 문제풀이 (0) | 2016.05.04 |
2016-04-28_조재찬_스터디일지_자료구조 (0) | 2016.04.29 |
2016-04-27_조재찬_업무일지_디지털제어-회로 기초 (0) | 2016.04.27 |
20160427_장진웅_업무일지_디지털 제어_기본 논리회로 실험2 (0) | 2016.04.27 |
20160426_장진웅_업무일지_디지털 제어_기본 논리회로 실험1 (0) | 2016.04.27 |