2020. 11. 11. 10:46ㆍ개인공부/C언어
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*
10
10 / 2 = 5, remainder = 0
5 / 2 = 2, remainder = 1
2 / 2 = 1, remainder = 0
1 / 2 = 0, remainder = 1
*/
void print_binary(unsigned long n);
void print_binary_loop(unsigned long n);
int main() {
unsigned long num = 10;
print_binary_loop(num);
print_binary(num);
return 0;
}
//Note : printing order is reversed!
void print_binary_loop(unsigned long num)
{
while (1)
{
int quotient = num / 2;
int remainder = num % 2;
printf("%d", remainder); // remainder is 0 or 1
num = quotient;
if (num == 0) break;
}
printf("\n");
}
void print_binary(unsigned long num)
{
int remainder = num % 2;
if (num >= 2)
print_binary(num / 2);
printf("%d", remainder); // 출력하는 부분이 recursion다음에 되있다.
//재귀호출이 다시 되돌아가는 원리로 구현. 재귀호출과 스택 참조.
return;
}
프로그래밍은 정말 아름다운거 같다.
int main() {
unsigned long num = 10;
print_binary_loop(num);
print_binary(num);
return 0;
}
1. main()에서 num 변수를 스택에 올리고
2. print_binary_loop 함수에 인자 10을 보낸다.
void print_binary_loop(unsigned long num)
{
while (1)
{
int quotient = num / 2;
int remainder = num % 2;
printf("%d", remainder); // remainder is 0 or 1
num = quotient;
if (num == 0) break;
}
printf("\n");
}
3. 10의 값을 지닌 num을 받은 print_binary_loop 는 while문을 실행하게 된다. ( if(num==0) break; 을 충족시키기 전까지 계속 반복된다.)
4. int quotient 은 stack에 올라가고 num/2 의값 5를 가진다.
5. int remainder 는 stack에 올라가고 num %2 의값 1을 가진다.
6. printf("%d", remainder); 함수는 stack에 적재된 remainder의 값 1을 프린트 한다.
7. stack에 적재된 quotient의 값 5는 num변수에 대입된다.
8. if(num==0) break; 의 조건을 충족하지 못하므로 (stack에 올라온 print_bianry_loop의 num은 현재 5의 값을 지닌다.)
다시 while문을 실행하게 된다.
4~8의 과정을 반복한다.
num : 10 5 2 1 0
quotient : 5 2 1 0
remainder : 0 1 0 1
위와 같이 값이 변하게 된다.
9. 마지막 num의 값이 0이 되었을때 if(num==0) break; 조건을 충족하게 되어 print_binary_loop문을 나가게 되고
다시 main() 함수로 돌아오고 다음 함수인 print_binary(num) 을 호출한다.
void print_binary(unsigned long num)
{
int remainder = num % 2;
if (num >= 2)
print_binary(num / 2);
printf("%d", remainder);
return;
}
10. 이때 num의 값은 0이 아니다. print_binary_loop의 변수 num의 값이 0이 되어 스택에서 사라지고 그 밑의 변수인 num은 10이다. 이 num의 10을 인자로 받아 실행한다.
11. remainder(첫번째) 변수가 스택위에 쌓인다. 10 % 2의 연산값으로 0이 된다. (나머지가 없으니)
12. if(num >=2) 의 조건을 충족하므로 print_binary(num / 2) 현재 num 10에서 나누기 2를 한 값인 5를 가지고 자신을 다시 호출한다.
13. stack 위에 num값 5가 쌓인다.
14. 내부호출된 함수의 새로운 변수 remainder(두번째) 에 num값 5가 들어오고 num%2 연산을 실행한다. 연산값은 1이다.
15. if ( num >= 2 ) 의 조건을 충족한다. stack에 쌓인 num의 값이 아직 5이기에 print_bianry(num /2 )를 실행
num은 2가된다.
16. 내부호출된 함수에서 내부호출된 함수의 새로운 변수 remainder(세번째) 에 num값 2가 들어오고 num%2 연산을 실행한다. 연산값은 0이다.
17. if ( num >= 2 ) 의 조건을 충족한다. stack에 쌓인 num의 값이 아직 2이기에 print_bianry(num /2 )를 실행
num은 1이된다.
18. 내부호출된 함수에서 내부호출된 함수에서 내부호출된 함수의 새로운 변수 remainder(네번째) 에 num값 1가 들어오고 num%2 연산을 실행한다. 연산값은 1이다
19. 이제 num의 값이 1이므로 if ( num >= 2 ) 의 조건을 충족하지 못하고 나온다.
20. printf("%d", remiainder) 에서 네번째 reaminder의 값 1을 출력
21. printf("%d", remiainder) 에서 세번째 reaminder의 값 0을 출력
22. printf("%d", remiainder) 에서 두번째 reaminder의 값 1을 출력
23. printf("%d", remiainder) 에서 첫번째 reaminder의 값 0을 출력
스택의 맨 윗부분 부터 읽어 들이면서 최종적으로 1010이 출력된다.
24. printf() 함수가 끝나고 return; 되어 print_binary 함수를 나간다.
25. main() 함수로 돌아와 return 0; 로 메인 함수 까지 끝나게 된다.
int main() {
unsigned long num = 10;
print_binary_loop(num);
print_binary(num);
return 0;
}
출처 : 홍정모의 따라배우는 C언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 헤더파일 만들기 (0) | 2020.11.11 |
---|---|
C언어 - 피보나치 예제와 재귀 호출의 장단점 (0) | 2020.11.11 |
C언어 - 팩토리얼 예제 (Factorial) (0) | 2020.11.11 |
C언어 - 재귀 호출 (0) | 2020.11.10 |
C언어 - 지역변수와 스택 (0) | 2020.11.10 |