#알고리즘(Algorithm) #재귀(Recursion)

sejun-Lee·2025년 4월 2일

알고리즘 (Algorithm)


  • 문제를 해결하기 위해 정해진 진행절차나 방법
  • 컴퓨터에서 알고리즘은 어떠한 행동을 하기 위해서 만들어진 프로그램 명령어의 집합

<알고리즘 조건>

  1. 입력 : 알고리즘은 0개 이상의 입력을 가져야 함
  2. 출력 : 알고리즘은 최소 1개 이상의 결과를 가져야 함
  3. 명확성 : 수행 과정은 모호하지 않고 정확한 수단을 제공해야 함
  4. 유한성 : 수행 과정은 무한하지 않고 유한한 작업 이후에 정지해야 함
  5. 효과성 : 모든 과정은 명백하게 실행 가능해야 함

static void Main(string[] args)
{   
    <의사코드> -> 인간의 언어로 흐름도를 먼저 그려보는것
    // 가장 큰 수를 찾기
    int[] array = { 1, 2, 3, 4, 5 };
    // 1. 가장 큰 수를 저장할 변수 만들기
    int max;
    // 2. 맨 처음부터 시작
    int index = 0;
    // 3. 맨 처음부터 시작한 수가 다음 수보다 작으면 큰 수를 다음수로 변경
    // 4. 다음 수를 또 다시 반복
}
      


재귀 (Recursion)


  • 어떠한 것을 정의할 때 자기 자신을 참조 하는것
  • 함수를 정의할 때 자기자신을 이용하여 표현하는 방법

<재귀함수 조건>

  1. 함수내용 중 자기자신함수를 다시 호출해야함
  2. 종료조건이 있어야 함

###<재귀함수 장점>

  1. 코드로 표현하기 어려운 경우도 직관적이고, 처리가 가능
  2. 분할정복을 통한 반절 계산이 가능해서 효율이 높아지게 구현이 가능

<재귀함수 사용>

 Factorial : 정수를 1이 될 때까지 차감하며 곱한 값
 x! = x * (x-1)!;
 1! = 1;
 ex) 5! = 5 * 4!
        = 5 * 4 * 3!
        = 5 * 4 * 3 * 2!
        = 5 * 4 * 3 * 2 * 1!
        = 5 * 4 * 3 * 2 * 1

 재귀함수는 예외 처리가 안되면(종료 조건) -> 오버플로우에 빠짐 (터짐)


int Factorial(int x)
{
    if (x == 1)
        return 1;
    else
        return x * Factorial(x - 1);
}



public class Folder
{
    //public List<string> files;
    public List<Folder> children;
}

public static void RemoveFolder(Folder folder)
{
    // 파일들 삭제하고

    foreach (var child in folder.children)
    {
        RemoveFolder(child);
    }
}

int Fibonaachi(int n)       //  재귀를 써도 최악의 알고리즘. -> 소모되는 시간 2배
{
    if(n==1) return 1;
    else if(n==2) return 1;
    return Fibonaachi(n - 1) + Fibonaachi(n - 2);
}

static void Main(string[] args)
{
    Console.WriteLine("Hello, World!");
}
profile
초보 개발자

0개의 댓글