카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2019/01/03

재귀 호출

재귀 호출

A(){
A();
}
재귀호출 == 반복문 + Stack
  caller == callee

A()함수 ()호츨자의 피연산자 A는 함수 이름이다. 함수 이름은 메모리 주소이다. 함수 이름의 주소 체계는 프로시저 형식의 주소가 부여된다.

동일한 함수가 동일한 이름의 함수를 호출 하면은 스텍 크기가 증가한다.

스텍또한 자료 구조이므로, 그 구조에 따른 형틀을 가지고 있으며, 그 용어를 stack frame라 한다.

stack frame은 논리 구조의 자료 구조이다.
스택의 논리 구조를 구현 할 필요는 없다. 누군가 이미 그 구조를 만들어 놓아기 때문이다.
스택 프레임 자료에다가 반복문을 추가해 사용하게 된다면, 그게 바로 재귀 호출이 된다.

스택 자료 구조의 특징
스택이 증가하면 메모리 주소는 감소한다.
순간 메모리 사용량 증가.
연산량이 많아 느림
파일시스템(폴더)나 트리구 형태의 자료에서 사용된다

재귀함수 분석
디버그 모드 컴파일
브레이크 포인트 설정
한줄단위 추적 ---> 메모리 맵에 흐름 확인

STDOUT 값 전달.

function factorial {
    (( $1 )) &&
    echo $(( $1 * $( factorial $(( $1 - 1 )) ) )) ||
    echo 1
}
factorial 5

function factorial {
    (( $1 )) || return 1
    factorial $(( $1 - 1 ))
    return $(( $1 * $? ))
}

factorial 5
echo $?

vi test.sh
#!/bin/bash
factorial()
{
    if [[ $1 -le 1 ]]
    then
        echo 1
    else
        last=$(factorial $[$1-1])
        echo $(($1 * last))
    fi
}
factorial 5

cp(recursive)은 디렉토리의 내용을 복사하고, 하위 디렉토리가 있는 경우(재귀 적으로)복사한다.

댓글 없음:

댓글 쓰기