작성
·
141
1
질문 1)
void print_binary(unsigned long n)
{
if (n > 0)
{
print_binary((n / 2));
printf("%d", n % 2);
}
}
이게 제가 작성한 코드입니다.
다름이 아니라
n이 0이 아니면 통과해서 recursion으로 함수 args에 5가 들어가고 그 다음엔 2.5가 들어가고 그 다음엔 1.0이 들어가고 그 다음엔 0.5값이니까 0이 들어가기에 튕깁니다.
그리고 다시 recursion 된 함수에서 돌아오는 과정을 거쳐야하는데 처음엔 5%2 이기에 1 이 출력
그 다음엔 2.5 %2 이기에 0이 출력
그 다음엔 1 % 2 이기에 1이 출력
그 다음엔 0% 2 이기에 0이 출력
그리고 끝난다. 라고 생각이 드는데요.
혹시 잘못 이해하고 있는게 있을까요?
******
질문 2 ) 반면 강습자로부터 작성된 코드는 아래와 같습니다.
void print_binary(unsigned long n)
{
int remainder = n % 2;
if (n >= 2)
print_binary(n / 2);
printf("%d", remainder);
return;
}
이는 처음 remainder에 10 %2 = 0을 넣고
if 문에 의해 n이 2보다 크거나 같기에 통과
함수에 5를 args로 던지고
5 % 2 = 1 을 넣고
if문 통과 후 2.5를 던짐
2 % 2 = 0 을 넣고
1을 args로 던짐
1 % 2 = 1 이다.
if문을 통과하지 못함
그 다음부터의 과정은 recursion을 하느라
작동되지 못한 라인부터 작동되는 것인가요?
그리고 그럴떄 거꾸로 작동되는 이유가 마지막 함수 실행의
값부터 실행되기의 그런건가요?
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
질문 1) 작성하신 코드에 대한 이해, 그리고 잘못 이해된 부분이 있는지 여부
void print_binary(unsigned long n)
{
if (n > 0) {
print_binary((n/2));
printf("%d", n %);
}
}
작성하신 코드의 흐름을 자세히 살펴보면 다음과 같습니다.
print_binary(5)
호출 : n
은 5
이므로, print_binary(2)
호출
print_binary(2)
호출 : n
은 2
이므로, print_bianry(1)
호출
print_binary(1)
호출 : n
은 1
이므로, print_binary(0)
호출
print_binary(0)
호출 : n
은 0
이므로, 아무것도 출력하지 않고 리턴
이제 호출 스택을 역순으로 따라가면서 나머지를 출력합니다.
print_binary(1)
에서 printf("%d", 1 % 2)
는 1
을 출력
print_binary(2)
에서 printf("%d", 2 % 2)
는 0
을 출력
print_binary(5)
에서 printf("%d", 5 % 2)
는 1
을 출력
따라서, 최종 출력은 101
이 됩니다.
즉, print_binary(0)
의 호출에서 재귀 호출은 중단되고, if()
조건 문 안의 printf()
함수는 실행되지 않습니다. (기저조건 도달)
질문 2) 재귀 함수의 호출 과정
: 네, 말씀하신 내용이 맞습니다.
재귀 호출 과정에서 "작동되지 못한 코드 라인"은 재귀 호출이 완료된 후에 실행됩니다.
재귀 함수에서, 함수는 자기 자신을 호출할 때 마다 현재의 실행 컨텍스트를 스택에 저장합니다.
그런 다음, 새로운 실행 컨텍스트에서 함수를 실행합니다.
이 과정이 반복되면서, 각각의 호출은 이전 호출이 완료되기를 기다리는 상태로 남아있습니다.
추후 재귀 함수가 종료 조건에 도달하면, 재귀 호출은 더 이상 발생하지 않습니다.
그리고, 이 때부터 스택에 저장된 각각의 실행 컨텍스트가 순차적으로 "되감기"되며, 각 실행 컨텍스트에서 남겨진 코드(재귀 호출 후의 코드)가 실행됩니다.
이러한 과정 때문에 재귀 함수에서는 코드가 마치 "거꾸로" 실행되는 것처럼 보이지만,
실제로는 재귀 호출이 완료된 후에 이전 컨텍스트로 돌아가서 남은 코드를 계속 실행하는 것입니다.
예를 들어, 작성하신 코드에서 print_bianry((n / 2));
다음 줄에 있는 printf("%d", remainder);
라인은 재귀 호출이 완료된 후에 실행됩니다.