[영리한 프로그래밍을 위한 알고리즘 강좌] - 순환(Recursion)의 개념과 기본 예제 3
Online Learning 2020. 12. 10. 14:31순환적 알고리즘 설계
- 적어도 하나의 base case, 즉 순환되지 않고 종료되는 case가 있어야 함
- 모든 case는 결국 base case로 수렴해야 함
if()
{
base case
}
else
{
recursion
}
암시적(implicit) 매개변수를 명시적(explicit) 매개변수로 바꾸어라.
github.com/VontineDev/OnlineLearning_Algorithm/tree/main/S02_Recursion
VontineDev/OnlineLearning_Algorithm
영리한 프로그래밍을 위한 알고리즘 강좌 예제연습. Contribute to VontineDev/OnlineLearning_Algorithm development by creating an account on GitHub.
github.com
11. 순차 탐색
가장 기본적인 순차탐색, 여기서는 n개의 데이터 data[0]~data[n-1]사이에서 target값을 찾는 것이다.
여기서 검색 구간 시작 인덱스 0 은 생략되어 있다. 즉, 암시적 매개변수이다.
int search(int data[], int n, int target)
{
for(int i =0; i<n; i++)
{
if(data[i]==target)
{
return i;
}
}
return -1;
}
이것을 Recursion이 가능하도록 만들려면 명시적 매개변수가 필요하다
#include <iostream>
using namespace std;
static int search(int data[], int begin, int end, int target)
{
//검색할 데이터가 없다면
if(begin>end)
{
return -1;
}
//target을 찾았다면 해당 index를 반환
else if(target==data[begin])
{
return begin;
}
//아직 못찾았다면 begin+1 에서 end까지의 위치에서 target을 찾는다.
else
{
return search(data, begin +1, end, target);
}
}
int main()
{
int myData[5] ={1,3,5,7,9};
cout << "myData is..." << endl;
for(int i=0; i<5; i++)
{
cout << myData[i];
if(i<4)
{
cout << ", ";
}
else
{
cout << endl;
}
}
cout << "Searching(5)..." << endl;
cout << "Position of (5) is " << search(myData,0,4,5) << endl;
}
12. 순차 탐색(뒤에서부터)
#include <iostream>
using namespace std;
static int ReverseSearch(int data[], int begin, int end, int target)
{
//검색할 데이터가 없다면
if(begin>end)
{
return -1;
}
//target을 찾았다면 해당 index를 반환
else if(target==data[end])
{
return end;
}
//아직 못찾았다면 begin+1 에서 end까지의 위치에서 target을 찾는다.
else
{
return ReverseSearch(data, begin, end-1, target);
}
}
int main()
{
int myData[5] ={1,3,5,7,9};
cout << "myData is..." << endl;
for(int i=0; i<5; i++)
{
cout << myData[i];
if(i<4)
{
cout << ", ";
}
else
{
cout << endl;
}
}
cout << "Searching(5)..." << endl;
cout << "Position of (5) is " << ReverseSearch(myData,0,4,5) << endl;
}
13. 순차 탐색(가운데, 왼쪽 ,오른쪽 순으로)
#include <iostream>
using namespace std;
static int Search(int data[], int begin, int end, int target)
{
//검색할 데이터가 없다면
if(begin>end)
{
return -1;
}
else
{
//가운데 값 middle을 지정해준다
int middle =(begin+end)/2;
//middle에서 target을 찾았다면
if(target==data[middle])
{
return middle;
}
int index = Search(data, begin, middle -1, target);
//index가 -1아니라면 -->target을 찾음
if(index!=-1)
{
return index;
}
//아직 못찾았다면 middle+1 에서 end까지의 위치에서 target을 찾는다.
else
{
return Search(data, middle+1, end, target);
}
}
}
int main()
{
int myData[5] ={1,3,5,7,9};
cout << "myData is..." << endl;
for(int i=0; i<5; i++)
{
cout << myData[i];
if(i<4)
{
cout << ", ";
}
else
{
cout << endl;
}
}
cout << "Searching(5)..." << endl;
cout << "Position of (5) is " << Search(myData,0,4,5) << endl;
}
14. 최대값 찾기
#include <iostream>
#include <math.h>
using namespace std;
static int FindMax(int data[], int begin, int end)
{
//검색할 데이터가 없다면
if(begin>end)
{
return data[begin];
}
else
{
return fmax(data[begin], FindMax(data, begin+1, end));
}
}
int main()
{
int myData[5] ={1,3,5,7,9};
cout << "myData is..." << endl;
for(int i=0; i<5; i++)
{
cout << myData[i];
if(i<4)
{
cout << ", ";
}
else
{
cout << endl;
}
}
cout << "Find max value..." << endl;
cout << "Max value is " << FindMax(myData,0,4) << endl;
}
15. 최대값 찾기(가운데부터)
#include <iostream>
#include <math.h>
using namespace std;
static int FindMax(int data[], int begin, int end)
{
//검색할 데이터가 1개라면
if(begin=end)
{
return data[begin];
}
else
{
int middle = (begin+end)/2;
int max1 = FindMax(data, begin, middle);
int max2 = FindMax(data, middle+1, end);
return fmax(max1, max2);
}
}
int main()
{
int myData[5] ={1,3,5,7,9};
cout << "myData is..." << endl;
for(int i=0; i<5; i++)
{
cout << myData[i];
if(i<4)
{
cout << ", ";
}
else
{
cout << endl;
}
}
cout << "Find max value..." << endl;
cout << "Max value is " << FindMax(myData,0,4) << endl;
}
16. 이진검색(Binary Search)
#include <iostream>
using namespace std;
//이진검색은 정렬되어 있다는 것을 가정한다.
static int BinarySearch(int data[], int target,int begin, int end)
{
//검색할 데이터가 없다면
if(begin>end)
{
return -1;
}
else
{
//가운데 값 middle을 지정해준다
int middle =(begin+end)/2;
int compResult = target-data[middle];
//compResult가 0 이면 --> 찾는 값과 같다면 middle의 위치 반환
if(compResult ==0)
{
return middle;
}
//middle에 있는 값이 target보다 큼, middle보다 작은 위치에서 검색
else if(compResult < 0)
{
return BinarySearch(data, target, begin, middle -1);
}
//middle에 있는 값이 target보다 작음, middle보다 큰 위치에서 검색
else
{
return BinarySearch(data, target, middle+1, end);
}
}
}
int main()
{
int myData[5] ={1,3,5,7,9};
cout << "myData is..." << endl;
for(int i=0; i<5; i++)
{
cout << myData[i];
if(i<4)
{
cout << ", ";
}
else
{
cout << endl;
}
}
cout << "Searching (7)..." << endl;
cout << "Position of (7) is " << BinarySearch(myData,7,0,4) << endl;
}
'Online Learning' 카테고리의 다른 글
[Data Science] Transact-SQL : Introduction to Joins (0) | 2020.12.11 |
---|---|
[영리한 프로그래밍을 위한 알고리즘 강좌] - Recursion의 응용 미로찾기 1 (0) | 2020.12.10 |
[영리한 프로그래밍을 위한 알고리즘 강좌] - 순환(Recursion)의 개념과 기본 예제 2 (2) | 2020.12.10 |
[Transact-SQL] Filtering and Using Predicates (0) | 2020.12.09 |
[Transact-SQL] Removing Duplicates , Sorting Results, (0) | 2020.12.09 |