[C언어] 재귀 호출 (recursive call) - 첨부파일 : backward.exe
COM2008. 2. 2. 09:44 |함수가 자기자신을 호출하는 것을 재귀호출이라 한다.
이때 호출중간에 또 자기자신을 호출하면, 이전에 호출했던 함수는 새로자신을 호출한 함수값을 받아야 리턴할수 있으므로 리턴을 미루고, 새호출의 리턴값을 받을때까지 대기한다.
이런젼차로, 새로 자신을 호출한 함수가 리턴값을 주면, 연쇄적으로 바로 이전의 호출이 리턴값을 갖게되어, 호출의 역순으로 리턴을 하게된다. 즉, 호출순으로 스택에 쌓였다가 역으로 꺼내면서 리턴한다.
당연한 얘기지만, 한번의 호출은 연속적인 호출로 이어지고 무한호출이 안되기 위해선, 언젠가는 리턴을 주는 상황이 와야된다.
예제로, 문자열을 하나 받아서 까꾸로 출력하는 함수를 (물론, 그냥 문자열 받아서 포인터로 거꾸로 돌리면서 찍어도 되지만) 재귀적으로 만들어보자.
계획.(재귀적으로...)
문자열에서 문자하나를 받아서 인쇄하는 함수를 만든다. 인쇄직전에 자신을 호출하면 인쇄를 뒤로 미루고 차례대로 뒷글자를 받아서 쌓아둔다. newline \n 을 받으면 재귀적 호출을 중지하도록 한다. 그러면 바로 직전에 미뤄둔 인쇄를 행하고, 연속적으로 거꾸로 인쇄한다.
#include<stdio.h>
#include<conio.h> /* for getch() in MS Windows Console. If Not MS platform, remove this and do not use getch() */
void backward(void);
void main(void)
{
printf("Input a string : ");
backward();
putchar('\n');
getch();
return ;
}
void backward(void)
{
char c;
if((c=getchar()) != '\n' )
backward();
putchar(c);
}