[1번 문제]
/*
순환적인 방법으로 피보나치 수열을 호출하였을 때 함수가 중복되어 호출되는 것을
확인할 수 있도록 각 함수의 매개변수별 호출 빈도를 측정해 출력하라
*/
#include <iostream>
using namespace std;
//순환적인 피보나치수열 계산 프로그램
int fibonacci(int *count, int n)
{
count[n]++;
if (n == 0)
return 0;
if (n == 1)
return 1;
return (fibonacci(count, n - 1) + fibonacci(count, n - 2));
}
int main(void)
{
int num;
cout << "몇번 째 피보나치 수열을 확인하고 싶으십니까 >";
cin >> num;
int *count = new int[num+1];
for (int i = 0; i < num + 1; i++)
count[i] = 0; //초기화
cout << num << "번째 피보나치 수열 숫자: " << fibonacci(count, num) << endl;
for (int i = num; i >= 0; i--)
cout << "fibonnaci(" << i << ") = " << count[i] << "번" << endl;
delete[]count; //동적할당한 메모리 반환
return 0;
}
[2번 문제]
/*
자료형이 long인 경우 가장 큰 피보나치 수를 구하라
*/
#include <iostream>
using namespace std;
long fibonacii(long n)
{
if (n < 2)
return n;
else
{
long temp, current = 1, last = 0;
for (long i = 2; i <= n; i++)
{
temp = current;
current += last;
last = temp;
}
return current;
}
}
int main(void)
{
long n = 0, result;
cout << "자료형이 long인 경우 가장 큰 피보나치 수를 구하기 위해 하나하나 출력해보겠습니다" << endl;
do
{
result = fibonacii(n);
cout << "fibonacci(" << n << ") = " << result << endl;
n++;
} while (result >= 0); //오버플로우가 발생하면 음수가 된다
//결국 1836311903이 최대 숫자
return 0;
}
[3번 문제]
/*
문자열의 내용을 반대로 바꾸는 순환적인 함수 reverse()를 구현하라
*/
#include <iostream>
using namespace std;
void reverse(char *msg, int len)
{
if (len == -1)
return;
else
{
cout << msg[len];
reverse(msg, --len);
}
}
int main(void)
{
reverse("ABCDE", strlen("ABCDE")-1);
return 0;
}
[4번 문제]
/*
다음의 수식과 같이 순환적으로 표현되는 Ackermann 함수를 구현하고 테스트한다
a(0, n)=1
a(1, 0)=2
a(m, 0)=m+2, if m>1
a(m, n)=a(a(m-1), n), n-1), if m>0 and n>0
*/
#include <iostream>
using namespace std;
int Ackermann(int m, int n)
{
if (m == 0)
return 1;
else if (m == 1 && n == 0)
return 2;
else if (n == 0)
return m + 2;
else
return Ackermann(Ackermann(m - 1, n), n - 1);
}
int main(void)
{
cout << "Ackermann(0, 3) = " << Ackermann(0, 3) << endl;
cout << "Ackermann(1, 0) = " << Ackermann(1, 0) << endl;
cout << "Ackermann(3, 0) = " << Ackermann(3, 0) << endl;
cout << "Ackermann(4, 2) = " << Ackermann(4, 2) << endl;
return 0;
}
[5번 문제]
/*
다음과 같은 모양을 출력하는 순환적인 함수를 작성하라
-------------------X------------------
---------X-------------------X--------
----X---------X---------X---------X---
-X----X----X----X----X----X----X----X-
*/
#include <iostream>
using namespace std;
int mark[38]; //각 행을 저장하는 배열
void draw_tree(int row, int left, int right);
void display_arrow(int *arr, int left, int right);
int main(void)
{
draw_tree(4, 1, 39);
return 0;
}
void draw_tree(int row, int left, int right)
{
if (row == 0)
return;
for (int i = 0; i < 38; i++)
mark[i] = 0; //배열 초기화
int X = 20;
int next = 20; //다음 X
for (int i = 0; i < 4 - row; i++)
X /= 2;//초기 X 위치
for (int i = 0; i < 3 - row; i++)
next /= 2;
mark[X] = 1;
while (X + next < 38)
{
X += next;
mark[X] = 1; //다음 위치도 표시
}
display_arrow(mark, left, right);
draw_tree(--row, left, right);
}
void display_arrow(int *arr, int left, int right)
{
for (int i = left; i < right; i++)
if (mark[i])
cout << "X";
else
cout << "-";
cout << endl;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] C++로 쉽게 풀어쓴 자료구조
'C++ > C++로 쉽게 풀어쓴 자료구조' 카테고리의 다른 글
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 9 (1) (0) | 2017.10.31 |
---|---|
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 8 (15) | 2017.10.12 |
C++로 쉽게 풀어쓴 자료구조 7장 연습문제 (0) | 2017.10.07 |
C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 6 (6) | 2017.10.04 |
C++로 쉽게 풀어쓴 자료구조 6장 연습문제 (0) | 2017.10.03 |