Recursion을 종료하는 조건 Recursive Call Parameter의 값이 변경

Download Report

Transcript Recursion을 종료하는 조건 Recursive Call Parameter의 값이 변경

C++ Programming:
review on C: Recursion
2016, Spring
Pusan National University
Ki-Joune Li
http://isel.cs.pnu.edu/~lik
PNU
STEM
Recursion

옛날에 어느 외로운 할아버지와 할머니가 살았습니다. 어느 날, 젊은 나그네가 와서 하루
밤만 재워달라고 하였습니다. 그래서 할아버지가 말씀하셨습니다. "여보게 젊은이, 우리
집에서 하루 밤을 자려면, 우리에게 재미있는 이야기를 해야 하네." 그 말을 들은 젊은 이
는 그렇게 하겠다고 하고 집에 들어가 할머니가 차려 주시는 저녁을 맛있게 먹었습니다.
그리고, 젊은 이는 할아버지와 할머니에게 재미있는 이야기를 들려주기 시작하였습니다.
"옛날에 어느 외로운 할아버지와 할머니가 살았습니다. 어느 날, 젊은 나그네가 와서 하루
밤만 재워달라고 하였습니다. 그래서 할아버지가 말씀하셨습니다. "여보게 젊은이, 우리
집에서 하루 밤을 자려면, 우리에게 재미있는 이야기를 해야 하네." 그 말을 들은 젊은 이
는 그렇게 하겠다고 하고 집에 들어가 할머니가 차려 주시는 저녁을 맛있게 먹었습니다.
그리고, 젊은 이는 할아버지와 할머니에게 재미있는 이야기를 들려주기 시작하였습니다.
" ... 이하 생략
 FunnyStory( )
{
A_Grand_Father_And_Grand_Mother();
A_Visit_Of_A_Young_Man();
Funny_Story();
}
PNU
STEM
Recursion

Recursion :



Function이 다시 자신을 호출하는 경우
반드시 Termination Condition이 있어야 함
사용 방식
type functionName(parameters) {
if(TerminalCodition) return value;
else {
. . .
Recursion을 종료하는
functionName(parameters');
}
Recursive Call
}
조건
Parameter의 값이 변경되어야 함
PNU
Samples
/* sample 1 */
int RecursiveSum(int values[], int n) {
if(n==0) return 0;
else return values[n-1] + RecursiveSum(values, n-1);
}
/* sample 2 */
int findMax(int values[], int n) { /* n is the number of elements */
int
i, max;
if(n==1) max=values[n-1];
else {
max=findMax(values,n-1);
if(values[n-1]>=max) return values[n-1];
}
return max;
}
STEM
PNU
Sample
/* sample 3 */
void reverse(char str[], int low, int high) {
if(l < h){
swap(&str[l], &str[h]);
reverse(str, l+1, h-1);
}
}
/* sample 4 */
int binarySearch(int values[],int low,int high,int key) { /* values: sorted array */
int
m;
if(high<=low) then return -1; /* it means NOT FOUND */
m = (high+low)/2;
if(values[m]==key) return m;
else if(key < values[m]) return binarySearch(values,low,m-1,key);
else return binarySearch(values,m+1,high,key);
}
STEM