W 개발 일지

591 : 함수3 - 자가진단5 본문

C/정올 문제풀이

591 : 함수3 - 자가진단5

waVwe 2020. 11. 5. 20:42
반응형

첫 번째 수는 1이고 N번째 수는 (N/2)번째 수(파이썬인경우 N//2번째)와 (N-1)번째 수의 합으로 구성된 수열이 있다.

50 이하의 자연수 N을 입력받아 재귀호출을 이용하여 이 수열에서 N번째 수를 출력하는 프로그램을 작성하시오.

(1 2 3 5 7 10 13 18 …)

예제 ) 8을 입력했을 때, 18이 나온다. (8번째 수는 4번째(8/2) 수인 5와 7번째(8-1) 수인 13의 합이다.)

 

#include<stdio.h>

int arr(int n){
	if(n<=1) return 1;
	
	return arr(n/2)+arr(n-1);
}

int main(){
	int n;
	scanf("%d",&n);
	printf("%d",arr(n));
}

 

 

아직 재귀함수가 익숙치 않아서 일반 함수 호출로는 풀 수 있었지만 재귀함수로는 어려워서

 

다른 멋진 사람들이 만든 코드를 참고했다 ㅠ

코드를 읽어보며 원리를 파헤쳐보자.

 

int main(){
	int n;
	scanf("%d",&n);
	printf("%d",arr(n));
}

 

main 함수는 위와 같다.

정수 n을 선언하고 입력받는다.

 

int arr(int n){

	if(n<=1) return 1;
	
	return arr(n/2)+arr(n-1);
}

 

딱 보면 알듯이 매우 간단하고 원리 또한 간단하다.

 

위 함수에 예제인 8을 넣어보면

arr(8) = arr(4) + arr(7)이 되는데

arr(4)는 다시 arr(2)+arr(3)으로 나눠지고 이 둘은 또 다시

arr(1) + arr(1) + arr(1) + arr(2)로 나눠진다.

 

수열의 첫번째 수가 1이므로 arr(4) = 1 + 1 + 1 + 2 = 5가 된다. { arr(2)는 2가 나온다. }

arr(7)도 같은 방식으로 재귀함수를 계속 호출해 나눠지다 보면 13이 나오는 것을 확인할 수 있다.

arr(8) = arr(4) + arr(7) = 5 + 13 = 18

 

#include<stdio.h>

int arr(int n){
	if(n<=1) return 1;
	
	return arr(n/2)+arr(n-1);
}

int main(){
	int n;
	scanf("%d",&n);
	printf("%d",arr(n));
}

 

다 만들어진 코드를 보면 딱 이해가 가는데 처음 만드는 것이 정말 어려운 것 같다 ...

 

반응형

'C > 정올 문제풀이' 카테고리의 다른 글

614 : 구조체 - 자가진단2  (0) 2020.11.09
187 : 문자열1 - 형성평가6  (0) 2020.11.05
590 : 함수3 - 자가진단4  (0) 2020.11.05
584 : 함수2 - 자가진단6  (0) 2020.11.03
583 : 함수2 - 자가진단5  (0) 2020.11.03