C++/C++로 쉽게 풀어쓴 자료구조

C++로 쉽게 풀어쓴 자료구조 프로그래밍 프로젝트 7

꾸준함. 2017. 10. 7. 22:31

[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++로 쉽게 풀어쓴 자료구조

반응형