순환
순환의 정의
순환의 예
위의 그림을 보면 알 수 있듯이 n 팩토리얼을 구하기 위해서는 n=0이 아닌 이상 (n-1)!이 사용 된다. 이러한 정의를 순환적이라고 할 수 있다. 순환 알고리즘은 자기 자신을 순환적으로 호출하는 부분과 순환 호출을 멈추는 부분으로 구성되어 있다. 만약 순환 호출을 멈추는 부분이 없다면 시스템 스택을 다 사용할 때까지 순환적으로 호출되다가 결국 에러를 내면서 멈출 것이다. 만약 위 그림 중 순환을 멈추는 부분이 없다면 시스템 스택을 다 사용할 때까지 순환적으로 호출되다가 결국 에러를 내면서 멈출 것이다.
factorial(3)을 호출하였을 경우에 위의 프로그램에서 함수가 호출 되는 순서를 살펴보면,
factorial(3)을 수행하는 도중에 factorial(2)를 호출하게 되고 factorial(2)는 다시 factorial(1)을 호출하게 된다. factorial(1)은 파라미터 n이 1이므로 if 문이 참이 되고 더 이상 순환 호출 없이 1을 리턴하게 된다. 이 리턴 값 1은 factorial(2)로 전달되고 factorial(2)는 여기에 2를 곱한 값인 2를 factorial(3)으로 전달한다. 마지막으로 리턴 값을 받은 factorial(3)은 이 값에 3을 곱하여 6을 반환한다. 그림으로 살펴보면 아래와 같다.
프로그래밍 언어에서 하나의 함수가 자기 자신을 다시 호출하는 것은 다른 함수를 호출하는 것과 동일하다. 즉 복귀주소가 시스템 스택에 저장되고 호출되는 함수를 위한 파라미터와 지역 변수를 스택으로부터 할당받는다. 이러한 함수를 위한 시스템 스택에서의 공간을 활성 레코드라 한다. 이러한 준비가 끝나면 호출된 함수의 코드의 시작 위치로 점프하게 되는 것이다. 호출된 함수가 끝나게 되면 시스템 스택에서 복귀 주소를 추출하여 호출한 함수로 되돌아가게 된다. 위 그림은 main()에서 factorial()을 호출하였을 때의 시스템 스택을 나타낸다. factorial()안에서 다시 factorial()이 호출되면 시스템 스택은 위와 같은 모양으로 쌓이게 된다.
순환과 반복
- 순환 : 자기 자신을 호출하여 문제를 해결.
- 반복 : for나 while등의 반복구조를 사용하여 반복시켜 문제를 해결.
- 프로그래밍 언어에서 되풀이하는 방법에는 반복과 순환이 있다. 반복이 많은 경우, 간편하고 효율적으로 되풀이를 구현할 수 있다. 하지만 반복을 사용하게 되면 지나치게 복잡해지는 문제들도 존재한다. 이런 경우에는 순환이 매우 좋은 해결책이 될 수 있다. 일반적으로 순환은 함수 호출을 하게 되므로 반복에 비해 수행속도 면에서는 떨어진다.
'DataStruct' 카테고리의 다른 글
자료구조 기본 정의 (0) | 2011.11.07 |
---|