80 likes | 839 Views
C 언어에서의 재귀함수 (recursive function) 를 이용한 프로그래밍. 차 영환. “ 순환 ” 또는 “ 재귀 ” (recursion) 란 n- 차의 함수를 정의할 때 이보다 1 차 낮은 (n-1)- 차의 함수를 사용하고 , 또한 (n-1)- 차의 함수 역시 그 보다 1 차 낮은 함수를 사용하여 순환적으로 반복적 형태로 정의되는 함수를 말한다 . 순환 ( 재귀 ) 함수의 예 - n ! = n * (n-1) ! - sum(n) = n + sum(n-1)
E N D
C 언어에서의 재귀함수(recursivefunction)를이용한 프로그래밍 차 영환
“순환” 또는 “재귀”(recursion)란 n-차의 함수를 정의할 때 이보다 1차 낮은 (n-1)-차의 함수를 사용하고, 또한 (n-1)-차의 함수 역시 그 보다 1차 낮은 함수를 사용하여 순환적으로 반복적 형태로 정의되는 함수를 말한다. • 순환(재귀) 함수의 예 • - n ! = n * (n-1) ! • - sum(n) = n + sum(n-1) • - F(n) = F(n-1) + F(n-2) • 순환(재귀) 함수를 사용하는 이유 • - 복잡한 알고리즘의 간단, 명료한 구현가능 순환(재귀), Recursion 이란?
함수 구조 • ……………….. • rf(n, …); // 재귀함수호출 • ……………….. • rf(n, …) // 재귀함수 정의 • { • ………… • if (종료조건) // 종료 조건 만족 시 수행 • return ……..; • else// n-1에 대한 재귀 호출 • returnrf(n-1, …); • ………… • } C 언어에서의 순환(재귀) 함수 사용
<문제> 1부터 10까지의 정수에 대한 factorial을 구하시오. <배경지식> - N ! = N ⅹ (N-1)! (종료조건 N=0일 때 N! = 1) 사용 예 <프로그램> #include <stdio.h> longfact(int ); int main(void) { int n; for (n=1; n<15; n++) printf(“%2d = %10ld\n”, n, fact(n)); return 0; } long fact(int i) { if (i==0) // 종료 조건 return1L; else // 재귀 호출 return ( i * fact(i-1) ); }
<문제> 1부터 100까지의 각각의 정수에 대해 1부터 해당 정수까지의 합을 구하는 프로그램을 재귀함수를 사용하여 작성하시오. <배경지식> sum(n) = n+ sum(n-1) 단, 종료 조건 n=1이면 sum(n)= 1 연습 1 <프로그램> #include <stdio.h> longsum(int ); int main(void) { int n; for (n=1; n<=100; n++) printf(“%2d = %10ld\n”, n, sum(n)); return 0; } long sum(int i) { if (i==1) // 종료조건 return1L; // 1L == 1l else // 재귀 호출 return ( i + sum(i-1) ); }
<문제> 1부터 100까지의 각각의정수에 대하여 1부터 자신의 수까지의 짝수들의 합을 구하는 프로그램을 재귀함수를 사용하여 작성하시오. 즉, 8이면 2+4+6+8이고 7이면 2+4+6을 수행해야 한다. 연습 2 <배경지식> sum(n) = n+ sum(n-2) if n%2 == 0 sum(n) = (n-1) + sum(n-2) otherwise 단, 종료 조건 n=2이면 sum(n)= 2 n=1이면 sum(n)=0 n=0이면 sum(n)=0 <재귀함수 구성 예> sum(20) = 20+ sum(18) sum(11) = 10 + sum(8)
<프로그램> #include<stdio.h> longesum(int ); int main(void) { int n; for (n=1; n<=100; n++) printf(“%2d = %10ld\n”, n, esum(n)); return 0; } long esum(int i) { if (i==0) return 0L; else if (i==1) return 0L; else if (i==2) return 2L; else { if ( i%2 == 0) return (i + esum(i-2)); else // if ( i%2 == 1) return (i-1 + esum(i-3)); } } 연습 2