완숙의 블로그

함수 2 (재귀함수) 본문

Programing Language/C

함수 2 (재귀함수)

완숙 2019. 1. 15. 13:50

함수 2

배열을 함수의 인자로 전달

int SumArray(int Array[4], ...)
{
    ...
}
  • 일반적으로 배열 명에는 빈 대괄호 []를 사용한다.
  • 지금 같은 경우는 크기 4짜리로 고정

 

int main()
{
    int Sum, a[] = {....};
    Sum = SumArray(a,5); // 함수 호출
    
    ...
        
    return 0;
}
  • 함수 호출 시에는 배열명만 적으면 된다.

 

Problem 1

#include <stdio.h>

int SumArray(int Array[], int Size);

int main() {
	int a[] = {10, 5, 15, 25, 7};
	int Sum;
  
	
	Sum = SumArray(a,5);
	printf("배열 원소의 합 : %d\n", Sum);
	
	return 0;
}

int SumArray(int Array[], int Size)
{
	int result = 0;
	for (int i = 0; i < Size; i++)
		result += Array[i];
	
	return result;
}

// 프로세스가 시작되었습니다..
> 배열 원소의 합 : 62

// 프로세스가 종료되었습니다.

 

Problem 2

#include <stdio.h>

double SelectSum(double Array[], int size);

int main() {
	double a[] = {20, 10, 5, 8, 28};
	int size = 0;
    
  size = sizeof(a)/sizeof(a[0]);
	
	printf("10보다 큰 배열 원소의 합 : %.2f\n",SelectSum(a, size));
	
	return 0;
}

double SelectSum(double Array[], int size)
{
	double Sum = 0;
	for (int i = 0; i <= size; i++){
		Sum = (Array[i] > 10) ? (Sum + Array[i]) : (Sum + 0);
	}
	
	return Sum;
}

// 프로세스가 시작되었습니다..
> 10보다 큰 배열 원소의 합 : 48.00

// 프로세스가 종료되었습니다.

 

 

재귀함수

재귀 호출

  • 함수에서 그 함수를 다시 호출하는 것

 

재귀함수

  • 재귀호출을 구현한 함수

 

Problem 1

#include <stdio.h>

int factorial(int n);

int main() {
	int fact_num;
	fact_num = factorial(10);
	
	printf("10 팩토리얼 : %d\n", fact_num);

	return 0;
}

int factorial(int n)
{
	if (n <= 1)
		return (1);
	else
		return (n * factorial(n-1));
}

// 프로세스가 시작되었습니다..
> 10 팩토리얼 : 3628800

// 프로세스가 종료되었습니다.

 

Problem 2

#include <stdio.h>

int sum(int a);

int main() {
	int input, s = 0;
	printf("양의 정수를 입력하세요 : ");
	scanf("%d", &input);
	
	s = sum(input);
	printf("재귀함수를 이용한 1부터 %d까지 합 : %d\n", input, s);
	return 0;
}

int sum(int a)
{
	if (a <= 1)
		return 1;
	else
		return a + sum(a-1);
}

// 프로세스가 시작되었습니다..
> 양의 정수를 입력하세요 : 4
재귀함수를 이용한 1부터 4까지 합 : 10

// 프로세스가 종료되었습니다.

 

 

표준 함수

절댓값 1 (abs)

2019-01-15 12 53 09

int abs(int a)

 

절댓값 2(fabs)

2019-01-15 12 54 19

double fabs(double a)

 

절댓값 3(labs)

2019-01-15 12 55 22

long labs(long a)

 

제곱(pow)

2019-01-15 12 58 57

double pow(double x, double y)	//x^y

 

제곱근(sqrt)

2019-01-15 12 59 10

double sqrt(double x);
  • x > 0 실수만 가능

 

Example

#include <stdio.h>
#include <math.h> // 수학 관련 헤더파일

int main() {
	printf(" i i제곱 i 세제곱 제곱근(sqrt)\n");
	printf("-----------------------\n");
	for (int i = 1; i < 10; i++){
		printf("%3d %7.1f %9.1f %9.1f\n",i,pow(i,2),pow(i,3),sqrt(i));
	}
	printf("\n");
				 
	printf("pow(2.72, 1.0) == %5.2f, ", pow(2.72,1.0));
	printf("sqrt(64) == %5.2f\n", sqrt(64));
	printf("abs(-20) == %5d, ", abs(-20));
	printf("ceil(5.1) == %5.2f, ", ceil(5.1));
	printf("floor(3.9) == %5.2f\n", floor(3.9));
	
				 
	return 0;
}

// 프로세스가 시작되었습니다..
>  i i제곱 i 세제곱 제곱근(sqrt)
-----------------------
  1     1.0       1.0       1.0
  2     4.0       8.0       1.4
  3     9.0      27.0       1.7
  4    16.0      64.0       2.0
  5    25.0     125.0       2.2
  6    36.0     216.0       2.4
  7    49.0     343.0       2.6
  8    64.0     512.0       2.8
  9    81.0     729.0       3.0

pow(2.72, 1.0) ==  2.72, sqrt(64) ==  8.00
abs(-20) ==    20, ceil(5.1) ==  6.00, floor(3.9) ==  3.00

// 프로세스가 종료되었습니다.

 

 

랜덤 기준 함수

2019-01-15 12 59 52

void srand( unsigned int seed)
  • 부호가 없는 값을 기준(시작값)으로 설정할 수 있다.

 

랜덤 함수

2019-01-15 1 01 39

int rand( void)

 

Example 1

#include <stdio.h>
#include <stdlib.h> // rand(), srand()를 위한 헤더파일 포함
#include <time.h> // time()을 위한 헤더파일 포함


int main() {
	
	srand((unsigned) time(NULL));
	
	printf("1~100 사이의 난수 5개 : \n");
	for (int i = 0; i < 5; i++){
		printf("%5d ", rand()%100 + 1); // + 1 안하면 0이 나올 가능성이 존재
	}
	printf("\t");
	
	return 0;
}

// 프로세스가 시작되었습니다..
> 1~100 사이의 난수 5개 :
   59    59    11    94    86
// 프로세스가 종료되었습니다.

 

Example 2

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 45

int getnumber(int n);

int main() {
	int n1, n2, n3, n4, n5;
	srand((unsigned)time(NULL));
	n1 = getnumber(MAX);
	
	do{
		n2 = getnumber(MAX);
	}while(n2 == n1);
	
	do{
		n3 = getnumber(MAX);
	}while(n3 == n1 || n3 == n2);	//둘 중 하나라도 같으면 1 -> 돌아감
	
	do{
		n4 = getnumber(MAX);
	}while(n4 == n1 || n4 == n2 || n4 == n3);
	
	do{
		n5 = getnumber(MAX);
	}while(n5 == n1 || n5 == n2 || n5 == n3 || n5 == n4);
	
	printf("로또 당첨 번호는 %d, %d, %d, %d, %d 입니다.\n", n1, n2, n3, n4, n5);
	
	return 0;
}

int getnumber(int n)
{
	return rand() % n + 1;
}

// 프로세스가 시작되었습니다..
> 로또 당첨 번호는 37, 9, 3, 31, 41 입니다.

// 프로세스가 종료되었습니다.

 

 

Problem

#include <stdio.h>
int main() {
	int pascal[10][10] = {0};
	
	for (int i = 0; i < 10; i++){
		for (int j = 0; j <= i; j++){
			
			if (i < 2 && (j == 0 || j == i)){
				pascal[i][j] = 1;
			}else{
				pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j];
			}
		}
	}
			
	for (int i = 0; i < 10; i++){
		for (int j = 0; j <= i; j++){
			printf("%d " , pascal[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

// 프로세스가 시작되었습니다..
> 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

// 프로세스가 종료되었습니다.

 

'Programing Language > C' 카테고리의 다른 글

함수 1  (0) 2019.01.14
배열 2(Array)  (0) 2019.01.11
배열 1(Array)  (0) 2019.01.10
반복문 2  (0) 2019.01.08
반복문 1  (0) 2019.01.07
Comments