킹머핀의 제작 일지
순환함수 이해하기 본문
아래 코드는 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;
}
..티스토리는 왜 글 수정 중에는 코드 하이라이트가 잘 적용되면서 발행만 하면 전부 무채색이 되는 걸까
'엔트리 > 심화' 카테고리의 다른 글
모듈러(%)를 쓰지 않고 정수를 구간 반복하는 방법 (2) | 2021.07.11 |
---|---|
MacOS) 에서 아나콘다를 사용하지 마세요 (0) | 2021.03.24 |
코랩) Flask 로컬 서버 접속하는 법 (0) | 2021.03.13 |
다층신경망과 CNN (0) | 2020.11.03 |
단층신경망에서 다층신경망으로 (0) | 2020.10.25 |