상세 컨텐츠

본문 제목

C언어로 쉽게 풀어쓴 자료구조 연습문제 2장

카테고리 없음

by state 2022. 12. 31. 02:25

본문

1. 팩토리얼을 계산하는 순환호출 함수 factorial에서 매개 변수로 5를 주었다면 최대 몇 개의 factorial 함수의 활성레코드가 동시에 존재할 수 있는가?

A. 1부터 5까지 총 5개의 활성레코드가 존재

 

2. 순환 호출을 하였을 경우에 활성 레코드들이 저장되는 위치는 어디인가?

A. 시스템 스택

 

함수가 순환호출을 하는 것은 다른 함수를 호출하는 것과 동일하며 복귀 주소가 시스템 스택에 저장되고 호출되는 함수를 위한 매개변수와 지역 변수를 스택으로부터 할당받는다. 이러한 함수를 위한 시스템 스택에서의 공간을 활성레코드라고 한다. 이러한 준비가 끄나면 호출된 함수의 시작 위치로 점프하여 수행을 시작한다. 만약 호출된 함수가 자기자신이라면 자기 자신의 시작 위치로 점프하게 되는 것이다. 호출된 함수가 끝나게 되면 시스템 스택에서 복귀주소를 추출하여 호출한 함수로 되돌아가게 된다. 순환호출이 계속 중첩될수록 시스템 스택에는 활성 레코드들이 쌓이게 된다.

 

3. 다음 중 활성 레코드에 저장되지 않는 것은 무엇인가?

A. (4) 순환호출의 순차번호

 

4. 하나의 함수가 호출될 수 있는 순환호출의 개수는?

A. 스택이 허용하는 한도

 

5. 다음의 순환호출 함수에서 잘못된 점은 무엇인가?

A. 순환을 하는 부분에서 매개변수의 값을 변화시키지 않으므로 순환호출이 무한히 이루어진다.

 

6. 다음의 순환호출 함수에서 잘못된 점은 무엇인가?

A. 순환을 멈추는 부분이 존재하지 않으므로 순환호출이 무한히 이루어진다.

 

7. 다음 함수를 sum(5)로 호출하였을 때, 화면에서 출력되는 내용과 함수의 반환값을 구하여라.

A. n을 출력하고 n + sum(n-1)을 순환시킨다.

출력값 :
5
4
3
2
1

반환값 :
5+4+3+2+1+sum(0) = 5+4+3+2+1+1 = 16

8. 다음 함수를 recursive(5)로 호출하였을 때, 화면에 출력되는 내용과 함수의 반환값을 구하여라.

A. n을 출력하고 2*recursive(n-1)+1 을 순환시킨다.

출력값 : 
5
4
3
2
1
반환값 :
2*(2*(2*(2*(2*(recursive(0)+1)+1)+1)+1) = 99

9. 다음 함수를 ecursive(10)로 호출하였을 때, 화면에 출력되는 내용과 함수의 반환값을 구하라.

A. n을 출력하고 recursive(n-3)+1 을 순환시킨다.

출력값 : 
10
9
8
7
6
5
4
3
2
1
반환값 : 
recursive(-2)+4 = -3

10. 다음 함수를 recursive(5)로 호출했을 때, 화면에 출력되는 내용을 쓰시오.

A. n이 1이 아니라면 recursive(n-1)을 순환시킨다.

출력값 : 1

 

11. 다음 함수에서 asterisk(5)를 호출할 때 출력되는 *의 개수는?

A. i는 정수이므로 asterisk(5/2)는 asterisk(2)이다.

asterisk(5)는 *을 하나 출력하고 asterisk(2) 2개를 순환 > '*' , 2개의 asterisk(2)는 *을 하나씩 출력하고 4개의 asterisk(1)을 순환 >'**', 4개의 asterisk(1)은 *을 하나씩 출력하고 순환을 종료한다 > '****'

 

12. 다음과 같은 함수를 호출하고 recursive 문자열을 입력한 다음 엔터키를 눌렀다면 화면에 출력되는 것은?

A. 

 

13. 다음을 계산하는 순환적인 프로그램을 작성하시오. 1+2+3+....+n

A.

#include <stdio.h>
#include <stdlib.h>

int recursive(int n){
        if(n <0) return 0;
        return n+ recursive(n-1);
}
int main(void){
        printf("%d",recursive(5));
}

14. 다음을 계산하는 순환적인 프로그램을 작성하시오 1 +1/2 +1/3 + .... + 1/n

A.

#include <stdio.h>
#include <stdlib.h>

double recursive(int n){
        if(n == 1) return 1;
        else return 1/n + recursive(n-1);
}
void main(){
        printf("%f",recursive(5));
}

 

15. 순환 호출되는 것을 이해하기 위해 fib 함수를 다음과 같이 바꾸어서 실행하여 보라. fib(6)을 호출할 때 화면에 출력되는  내용을 쓰시오

A. 주어진 코드는 피보나치 수열을 출력하는 프로그램이다. 피보나치 수열의 6번째 수는 5이다.

 

16. 다음의 순환적인 프로그램을 반복구조를 사용한 비순환적 프로그램으로 바꾸시오.

A. 주어진 코드는 1부터 n까지의 숫자 합을 구하는 프로그램이다. for문을 사용한다.

int sum_iter(int n){
	int result = 0;
    for(int i = 0; i <= n; i++) result = result + i;
    return result;
}

17. 이항계수를 계산하는 순환함수를 작성하라. 이항계수는 다음과 같이 순환적으로 정의된다. 반복함수로도 구현해보라.

A.

int binomial_recs(int n, int k){
	if(k==0||k==n) return 1;
    else return binomial(n-1,k-1)+binomial(n-1,k);
}

int binomial_iter(int n, int k){

18. Ackermann 함수는 다음과 같이 순환적으로 정의된다.

>> 판수에 따라 다르지만 A(m,n)=A(m-1,A(m,n-1)) 으로 수정하여 해결한다. 책에 오류가 많으니 뭔가 걸리면 하루종일 붙잡고 있지 말고 문제가 틀린지 의심해보자.

 

(1) A(3,2)와 A(2,3)의 값을 구하시오

A.

 

(2)Ackermann 함수를 구하는 순환적인 프로그램을 작성하시오.

A.

int ackermann(int m, int n){
	if(m==0) return n+1;
    else if(n==0) return ackermann(m-1,1);
    else return ackermann(m-1, ackermann(m,n-1))
}

 

(3) 위의 순환적인 프로그램을 for,while,do와 같은 반복구로를 사용한 비순환적 프로그램으로 바꾸시오.

A.

 

 

19. 본문의 순환적인 피보나치 수열 프로그램과 반복적인 피보나치 수열 프로그램의 수행 시간을 측정하여 비교하라. 어떤 결론을 내릴 수 있는가?

A. 순환적인 피보나치 수열은 이전에 계산했던 값을 계속 사용하게 되므로 반복적인 피보나치 수열을 계산하는 것에 비해 급수적으로 수행 시간이 증가한다.

 

20. 순환 호출에서는 순환호출을 할 때마다 문제의 크기가 작아져야 한다.

(1) 팩토리얼 계산 문제에서 순환호출이 일어날 때 마다 문제가 어떻게 작아지는가?

A. fib(n-1)+fib(n-2)

(2) 하노이의 탑에서 순환호출이 일어날 때 마다 문제가 어떻게 작아지는가?

A. hanoi_tower(n-1, tmp, from, to)

 

21. 컴퓨터 그래픽의 영역 채우기 알고리즘

댓글 영역