728x90
반응형
SMALL

재귀 함수는 함수가 자기 자신을 호출하는 것을 말한다.

재귀 함수는 다음과 같은 특징을 가지고 있다:

  1. 기본 케이스 (Base Case): 재귀 함수는 반드시 종료 조건을 가져야 한다. 이 종료 조건을 만족할 때는 자기 자신을 호출하지 않고 함수를 종료한다. 기본 케이스는 재귀 호출을 멈추고 원하는 결과를 반환하는 부분이다.
  2. 재귀 케이스 (Recursive Case): 기본 케이스가 아닌 경우, 재귀 함수는 자기 자신을 한 번 이상 호출한다. 이때 함수의 인자 또는 상태를 조정하여 재귀 호출을 계속 진행하게 된다.

재귀 함수는 복잡한 문제를 간결하게 해결할 수 있는 장점이 있다.

예시 1: 팩토리얼 계산

int factorial(int n) {
    if (n == 0) {
        return 1;  // 기본 케이스: 0!은 1이다.
    } else {
        return n * factorial(n - 1);  // 재귀 케이스: n! = n * (n-1)!
    }
}

예시 2: 피보나치 수열

int fibonacci(int n) {
    if (n <= 1) {
        return n;  // 기본 케이스: 0번째와 1번째 수는 그대로 반환한다.
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);  
// 재귀 케이스: n번째 수 = (n-1)번째 수 + (n-2)번째 수
    }
}

재귀 함수는 재귀 호출을 통해 문제를 작은 조각으로 나누고 해결한다. 하지만 잘못 사용하면 무한 재귀에 빠질 수 있으므로, 종료 조건을 정확하게 설정하고 적절히 활용해야 한다. 또한, 재귀 함수는 반복적인 호출을 많이 사용하므로 성능에 주의해야 한다.

[data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2738%27%20height=%2738%27/%3e](data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2738%27%20height=%2738%27/%3e)

728x90
반응형
LIST

'CS > 알고리즘' 카테고리의 다른 글

해싱(Hashing)  (0) 2023.05.30
이진 검색(Binary Search)  (0) 2023.05.30
선형 검색(Linear Search)  (0) 2023.05.30
너비 우선 탐색(BFS)  (0) 2023.05.30
최소 힙(Minimum Heap)  (0) 2023.05.29
728x90
반응형
SMALL

고수준 언어와 어셈블리 언어의 차이점

모두 프로그래밍 언어이지만, 그들의 추상화 수준, 사용 용이성, 이식성 등 여러 측면에서 중요한 차이점이 있다.

  1. 추상화 수준: 고수준 언어는 많은 수준의 추상화를 제공한. 이는 개발자가 프로그래밍 할 때 더 복잡한 작업을 단순한 명령문으로 수행할 수 있게 해준다. 반면에 어셈블리 언어는 저수준 언어로, 하드웨어에 가까운 명령을 사용한다. 이는 더 세밀한 제어를 가능하게 하지만, 동시에 코드를 작성하고 이해하는 것을 더 복잡하게 만든다.
  2. 사용 용이성: 고수준 언어는 일반적으로 코드를 작성하고 이해하는 것이 더 쉽다. 이는 고수준 언어가 일반적으로 사람이 이해하기 쉬운 형식과 문법을 사용하기 때문이다. 반면에 어셈블리 언어는 특정 CPU 아키텍처에 대한 깊은 이해를 요구하며, 문법이 사람이 이해하기 어렵다.
  3. 이식성: 고수준 언어로 작성된 프로그램은 일반적으로 여러 플랫폼에서 실행될 수 있다. 이는 고수준 언어가 특정 하드웨어나 운영 체제에 의존하지 않도록 설계되었기 때문이다. 반면에 어셈블리 언어로 작성된 프로그램은 특정 CPU 아키텍처에 맞게 작성되므로, 다른 아키텍처에서는 실행되지 않을 수 있다.
  4. 효율성: 어셈블리 언어는 저수준에서 동작하기 때문에, 필요한 경우 최적화를 위해 사용될 수 있다. 하지만, 이는 프로그래머가 하드웨어에 대한 매우 깊은 이해를 가져야 한다는 것을 의미한다. 반면에 고수준 언어는 자동화된 메모리 관리, 오류 검사 등의 기능을 제공함으로써 프로그래머의 작업을 단순화하지만, 이러한 편의성은 때때로 성능에 부정적인 영향을 미칠 수 있다.

요약하면, 고수준 언어는 개발자의 편의성과 코드의 이식성에 중점을 두고 있으며, 어셈블리 언어는 효율성과 세밀한 제어에 중점을 두고 있다. 그러나 최신 고수준 언어의 컴파일러는 상당히 효율적인 기계 코드를 생성할 수 있으므로, 대부분의 경우에는 어셈블리 언어를 직접 사용할 필요는 없다.

728x90
반응형
LIST

'CS > 프로그래밍 언어' 카테고리의 다른 글

베이직(BASIC)  (0) 2023.05.29
코볼(COBOL)  (0) 2023.05.29
포트란(Fortran)  (0) 2023.05.29
컴파일러  (0) 2023.05.26
고수준 프로그래밍 언어(high-level programming language)  (0) 2023.05.26
728x90
반응형
SMALL

컴파일러

  • 고수준 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 저수준 언어(일반적으로 기계어 또는 바이트 코드)로 변환하는 소프트웨어 도구이다. 이 변환 과정을 "컴파일"이라고 한다.

컴파일러는 일반적으로 다음과 같은 두 단계로 작동한다:

  1. 전처리 및 구문 분석 단계: 이 단계에서 컴파일러는 소스 코드를 읽고, 구문을 분석하여 추상 구문 트리(Abstract Syntax Tree, AST)라는 내부 표현을 생성한다. AST는 소스 코드의 구조와 의미를 반영하며, 이 단계에서 문법 오류가 발견되면 컴파일러는 오류 메시지를 출력한다.
  2. 코드 생성 및 최적화 단계: 컴파일러는 AST를 기계어나 바이트 코드와 같은 저수준 코드로 변환한다. 이 과정에서 컴파일러는 다양한 최적화를 수행하여 생성된 코드가 가능한 효율적으로 실행될 수 있도록 한다.

컴파일러의 주요 장점 중 하나는 소스 코드를 한 번 컴파일하면, 결과로 생성된 실행 파일은 별도의 컴파일 과정 없이 바로 실행할 수 있다는 것이다. 이는 인터프리터와 대조적인 점으로, 인터프리터는 소스 코드를 라인별로 해석하고 실행하기 때문에 실행 시마다 해석 과정이 필요하다.

또한, 컴파일러는 코드 최적화를 통해 프로그램의 실행 속도를 높이는 데 중요한 역할을 한다. 하지만 반대편으로는 컴파일 과정이 인터프리터에 비해 시간이 더 걸릴 수 있다.

컴파일러의 예로는 C의 GCC, Java의 javac, Python의 PyPy 등이 있다.

728x90
반응형
LIST

'CS > 프로그래밍 언어' 카테고리의 다른 글

베이직(BASIC)  (0) 2023.05.29
코볼(COBOL)  (0) 2023.05.29
포트란(Fortran)  (0) 2023.05.29
고수준 언어와 어셈블리 언어의 차이점  (0) 2023.05.26
고수준 프로그래밍 언어(high-level programming language)  (0) 2023.05.26

+ Recent posts