[자료구조] 재귀함수 c

K근형·2024년 1월 5일
0

자료구조

목록 보기
8/12

재귀함수 c

#include <stdio.h>

#pragma warning (disable : 4996)

//구구단(2단) 재귀함수로 구현
void multitable(int num)
{
    if (num == 0)
    {
        printf("함수종료\n");
        return;
    }

    multitable(num -1);
    printf("2 * %d = %d\n", num, 2 * num);

    return;

}

int main()
{
    multitable(9);
    printf("main 종료");
    return 0;
}

거듭제곱 c

#include <stdio.h>

#pragma warning (disable : 4996)

double power(int x, int y)
{
    if (y == 0)
        return 1;

    return x * power(x, y-1); //x ^ (y - 1);
}

int main()
{
    int base, exponent;
    printf("밑수 입력 : ");
    scanf("%d", &base);

    printf("지수 입력 : ");
    scanf("%d", &exponent);

    printf("%d^%d = %f\n", base, exponent, power(base, exponent));

    return 0;
}

팩토리얼 c

/*
 음이 아닌 정수의 facotorial(순차곱, 계승)을 구하는 프로그램을 작성해보자.

 팩토리얼 : n이 자연수일때, 1에서 n까지의 모든 자연수의 곱

 [팩토리얼 일반화]
 N <= 1, N = 1
 N! = N * (N-1)!
 */

#include <stdio.h>

#pragma warning (disable : 4996)

double factorial(int n)
{
    if (n <= 1) //재귀의 종료 조건
    {
        printf("%d = ", n);
        return 1;
    }

    printf("%d * ", n);
    return n * factorial(n - 1); //(n - 1)!;

}

int main()
{
    int num;
    double result;

    printf("자연수 입력 : ");
    scanf("%d", &num);

    printf("%d! = ", num);
    result = factorial(num);
    printf("%f\n", result);
    return 0;
}

최대공약수 c

#include <stdio.h>

#pragma warning (disable : 4996)

int gcd(int x, int y)
{
    if (y == 0) //나머지값이 0인 경우?
    {
        return x; //최대 공약수 리턴
    }
    return gcd(y, x % y);
}

int main()
{
    int n1, n2, result;

    printf("최대 공약수를 구할 정수 2개 입력 : ");
    scanf("%d %d", &n1, &n2);

    result = gcd(n1, n2);

    printf("%d와 %d의 최대 공약수는 %d입니다.\n", n1, n2, result);

    return 0;

}

이진법식 c

#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable : 4996)

int binarySearch(int* arr, int begin, int end, int target);
int binarySearchLoop(int* arr, int begin, int end, int target);

int main(void)
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int searchData;

    printf("\n찾는 값 입력: ");
    scanf("%d", &searchData);

    //이진 탐색 : O(logN) : 배열이 정렬되어 있는 상태라면 가능
    //정렬 되지 않은 상태의 배열의 시간 복잡도는 O(N)

    //찾는 값이 존재하면 찾는 값의 인덱스를 리턴, 존재하지 않으면 -1을 리턴
    int index;
    //index = binarySearch(arr, 0, 9, searchData); //배열, 첫 번째 인덱스, 마지막 인덱스, 검색데이터
    index = binarySearchLoop(arr, 0, 9, searchData);

    if (index != -1)
        printf("\n\n\t\t찾는 값은 arr[%d]번째에 저장되어 있습니다.\n", index);
    else
        printf("\n\n\t\t찾는 값은 존재하지 않습니다.\n");
    return 0;
}

int binarySearch(int* arr, int begin, int end, int target)
{
    int mid = (begin + end) / 2;

    if(begin > end) //찾는 값이 없는 경우?
        return -1;


    if(arr[mid] == target) //중간값이 찾는 값이라면?
        return mid; //찾는 값 인덱스 리턴
    else if(arr[mid] < target)
        return binarySearch(arr, mid + 1, end, target); //중간 값의 오른쪽으로 재귀 호출
    else
        return binarySearch(arr, begin, mid - 1, target);
}

int binarySearchLoop(int* arr, int begin, int end, int target)
{
    //Loop가 아닌 반복물을 이용해서 처리
    int mid;
    while (begin <= end)
    {
        mid = (begin + end) / 2;

        if(arr[mid] == target) //중간값이 찾는 값이라면?
            return mid; //찾는 값 인덱스 리턴
        else if(arr[mid] < target)
            begin = mid + 1;
        else
            end = mid - 1;
    }

    return -1; //찾는 값이 없는 경우
}

피오나치수열

#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable : 4996)

//Dyanmic Programming(DP) :
//큰 문제를 작은 문제로 분할 했을 때 연산 과정이 중복 된다면 연산 결과를 저장해서 재사용!!!

// memoization
//100번째 항까지의 결과를 저장
double mz[101] = { 0, 1, 1 }; // 첫 번째 항과 두 번째 항의 값은 1로 초기화

double fibo(int n) //top-down방식
{
    /*
    if (n <= 2) //1,2항은 1
        return 1;

    //세 번째 항부터는 이 전 두항의 합으로 이뤄진다.
    return fibo(n - 1) + fibo(n - 2);
     */

    if (mz[n] != 0) //저장된 값이 있다면?
        return mz[n]; //연산하지 않고 저장된 값을 리턴

    // 값을 저장하러 출발
    mz[n] = fibo(n - 1) + fibo(n - 2); //값을 저장
    return mz[n]; //저장된 값을 리턴
}

double fiboLoop(int n) // bottom-up방식
{
    //반복문 이용
    for(int i = 3; i < n; i++) //3번째항 ~ n번째항
    {
        mz[i] = mz[i - 1] + mz[i - 2];
    }
    return mz[n]; //n번째 항에 저장된 값을 리턴
}

int main()
{
    int n;
    printf("피보나치 수열의 몇 번째 항을 구하시겠습니가? ");
    scanf("%d", &n);

    double result;
    result = fibo(n);
    printf("\n\n\t\t%d항의 값은 %.0f입니다.\n", n, result);
    return 0;
}
profile
진심입니다.

0개의 댓글