C/잡다한 C
함수가 메모리의 역할도 할 수 있는것인가...?
제이지연
2021. 11. 3. 17:16
문제: 25개의 자연수(71~100)를 무작위로 생성한 후(중복 수 배제) 재귀호출으로 각각 이진탐색(binary search)을 사용하여 사용자로부터 입력받은 하나의 자연수(71~100)의 위치와 위치결정까지의 비교횟수를 출력하는 프로그램을 작성(없으면 “없음” 출력)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int overlap(int num[], int i){
int j;
for(j=0;j<i;j++){
if(num[i]==num[j]){
i-=1;
break;
}
}
return i;
}
void swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
int bin_search(int num[], int input, int *count, int first, int last){
int mid=(first+last)/2;
int a;
(*count)++;
if(first<=last){
if(input>num[mid]){
first=mid+1;
bin_search(num, input, count, first, last);
}
else if(input<num[mid]){
last=mid-1;
bin_search(num, input, count, first, last);
}
else return mid;
}
else return -1;
}
int main(){
int num[25], i,j, input, mid;
int count=0,first=0, last=24;
for(i=0;i<25;i++){
num[i] = rand()%30+71;
i=overlap(num,i);
}
for(i=0;i<24;i++){
for(j=i+1;j<25;j++){
if(num[i]>num[j]){
swap(&num[i], &num[j]);
}
}
}
for(i=0;i<25;i++){
printf("%d ", num[i]);
}
printf("\n하나의 자연수를 입력하시오.:");
scanf("%d", &input);
mid=bin_search(num, input, &count, first, last);
if(mid==-1) printf("찾는 수 없음, 비교횟수 %d", count);
else printf("num[%d], 비교횟수 %d",mid,count);
}
지적사항 : int bin_search의 경우 정수형 반환값이 생성되는데 재귀호출하는 함수를 그냥 bin_search();로 받았다..근데 실행은 제대로 되는 게 의문이다.
int bin_search(int num[], int input, int *count, int first, int last){
int mid=(first+last)/2;
int a;
(*count)++;
if(first<=last){
if(input>num[mid]){
first=mid+1;
bin_search(num, input, count, first, last);
}
else if(input<num[mid]){
last=mid-1;
bin_search(num, input, count, first, last);
}
else return mid;
}
else return -1;
}
이부분에서 return 된 mid 또는 -1이 저장되지 않았는데도 잘 돌아가는 것을 보니 이렇게도 쓰일 수 있다는 것을 깨닫긴 했다..
원래 바른 논리는
int bin_search(int num[], int input, int *count, int first, int last){
int mid=(first+last)/2;
int a;
(*count)++;
if(first<=last){
if(input>num[mid]){
first=mid+1;
a=bin_search(num, input, count, first, last);
return a;
}
else if(input<num[mid]){
last=mid-1;
a=bin_search(num, input, count, first, last);
return a;
}
else return mid;
}
else return -1;
}
이렇게 int형 메모리 a를 지정해주어야 할 것이다.