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를 지정해주어야 할 것이다.