Notice
Recent Posts
Recent Comments
Link
05-18 11:53
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

킹머핀의 제작 일지

순환함수 이해하기 본문

엔트리/심화

순환함수 이해하기

KingMUffin 2021. 4. 4. 18:04

아래 코드는 k부터 n까지 정수를 더하는 명령. (단, k <= n) 아래로 갈수록 중간값 m을 사용하는데, 단순히 순환함수 테크닉을 기르기 위한 용도일 뿐 정의한 모든 함수는 실행 결과가 같다.

순환함수의 이해는 이 코드 하나로 끝낸다!

#include <stdio.h>

int main()
{
	while (1) {
		int k, n;
		
		printf("k ? ");
		scanf("%d", &k);
		
		if (k < 0)
			break;
		
		printf("n ? ");
		scanf("%d", &n);
		
		if (k > n)
			break;
		
		//int ToN(int n);
		//int ToKN(int k, int n);
		//int ToNK(int k, int n);
		//int ToKMN(int k, int n);
		//int ToNMK(int k, int n);
		//int ToKMMN(int k, int n);
		int ToKMMMN(int k, int n);
		printf(" Print: ");
		printf("\nReturn: %d\n\n", ToKMMMN(k, n));
	}
	return 0;
}

int ToN(int n) //n부터 1까지 더하기
{
	if (n == 0) return 0;
	printf("%d ", n);
	return ToN(n - 1) + n;
}

int ToKN(int k, int n)
{
	if (k > n) return 0;
	printf("%d ", n);
	return ToKN(k, n - 1) + n;
}

int ToNK(int k, int n)
{
	if (k > n) return 0;
	printf("%d ", k);
	return ToNK(k + 1, n) + k;
}

int ToKMN(int k, int n)
{
	if (k > n) return 0;
	int m = (k + n) / 2;
	
	int t1 = ToKMN(k, m - 1);
	printf("%d ", m);
	int t2 = ToKMN(m + 1, n);
	return t1 + m + t2;
}

int ToNMK(int k, int n)
{
	if (k > n) return 0;
	int m = (k + n) / 2;
	
	int t1 = ToKMN(k, m - 1);
	int t2 = ToKMN(m, n - 1);
	printf("%d ", n);
	return t1 + t2 + n;
}

int ToKMMN(int k, int n)
{
	if (k > n)
		return 0;
	if (k == n)	//이게 없으면 같은 숫자를 입력해도 두 번 출력하고 계산한다. 즉 중단 조건은 출력이 한 번 이하인 경우.
	{
		printf("%d ", k);
		return k;
	}
	int t = (n - k + 1) / 3; //왜 1을 더하는지 명확하게 설명할수 있을까?
	int m1 = k + t;
	int m2 = k + t * 2;
	
	int t1 = ToKMMN(k, m1 - 1);
	printf("%d ", m1);
	int t2 = ToKMMN(m1 + 1, m2 - 1);
	printf("%d ", m2);
	int t3 = ToKMMN(m2 + 1, n);
	return t1 + m1 + t2 + m2 + t3;
}

int ToKMMMN(int k, int n)
{
	if (n - k < 2) //중단 조건은 출력이 두 번 이하인 경우.
	{
		if (n - k == 1) //k < n
		{
			printf("%d %d ", k, n);
			return k + n;
		}
		else if (n - k == 0) //k == n
		{
			printf("%d ", k);
			return k;
		}
		return 0; // k > n
	}
	
	// if (n - k <= 1)
	// {
	// 	int nSum = 0;
	// 	switch(n - k)
	// 	{
	// 		case 1 : 
	// 			printf("%d 오", n);
	// 			nSum += n;
	// 		case 0 : //break문 없음.
	// 			printf("%d 올", k);
	// 			nSum += k;
	// 	}
	// 	return nSum;
	// }
	
// 	int t = (n - k + 1) / 4; //이렇게 먼저 나누어버리면
// 	int m1 = k + t;
// 	int m2 = k + t * 2; //곱한 뒤 나누므로 값이 다를 수 있음.
// 	int m3 = k + t * 3;
	
	int t = n - k + 1;
	int m1 = k + t / 4;
	int m2 = k + t * 2 / 4;
	int m3 = k + t * 3 / 4;
	
// 	int t4 = ToKMMMN(m3 + 1, n);
// 	printf("%d ", m3);
// 	int t3 = ToKMMMN(m2 + 1, m3 - 1);
// 	printf("%d ", m2);
// 	int t2 = ToKMMMN(m1 + 1, m2 - 1);
// 	printf("%d ", m1);
// 	int t1 = ToKMMMN(k, m1 - 1);
	
	int t1 = ToKMMMN(k, m1 - 1);
	printf("%d ", m1);
	int t2 = ToKMMMN(m1 + 1, m2 - 1);
	printf("%d ", m2);
	int t3 = ToKMMMN(m2 + 1, m3 - 1);
	printf("%d ", m3);
	int t4 = ToKMMMN(m3 + 1, n);
	
	return t1 + m1 + t2 + m2 + t3 + m3 + t4;
}

..티스토리는 왜 글 수정 중에는 코드 하이라이트가 잘 적용되면서 발행만 하면 전부 무채색이 되는 걸까