본문 바로가기
VBA

[VBA_재귀함수] 삼각형 조합하기

by 일등미노왕국 2021. 8. 23.

이번에 사용될 재귀함수 구문은 입력된 텍스트를 통해서 자기 자신부터 하나씩 조합하여 마지막 전체 텍스트 값을 모두 출력하는 재귀함수 구문이다.

이 구문의 핵심은 이렇다. 재귀는 재귀 호출이 있은 후 스택을 종료할 수 있는 귀속되는 구문이 반드시 있어야 한다. 그 구문이 카운터가 1이냐를 물어본 후 맞다면 이전까지 조합된 문자와 마지막을 결합하는 것이다. 


상위 프로시저에서 FOR 문을 통해서 1부터 마지막 텍스트까지 반복하는 구문속에 하위 프로시저를 호출하면 하위 프로시저에서는 재귀함수의 귀속 여부를 따져서 출력을 하거나 아님 재귀구문을 호출하기 위해 변수들을 재 설정하여 호출하게 된다. 

 

F8을 누르면서 지역창이나 조사식창을 이용하더라도 따라가다 보면 자꾸 값을 놓치게 될것이다. 막연하게 따라간다면 필히 재귀함수는 나랑 맞지 않다면 포기하게 될것인데...괜찮다...늘 이야기 하지 않는가 나도했다.

ABC를 예를 들면

A,B,C의 카운터 값은 1이다. 귀속구문에서 1이냐를 물어보고 그에 해당하니 공백과 각각의 문자가 조합되어

A,B,C가 인쇄될것이다.

그다음은 2자리 구해야 한다.

1의 자리를 구한 후 A,B,C는 하위 프로시저에서 종료되고 상위프로시저로 재귀를 호출했던 전으로 돌아갔을 것이다.

상위 프로시저에서는 다음 FOR문을 돌리게 되고 그럼 카운터가 Cnt-i+1 이므로 카운터가 2가 되어 하위 프로시저를 호출하게 된다. 귀속구문에서 1이 아님으로 else 구문으로 내려가 재귀를 호출하게 되는데 이때 문자조합에 현재의 하위프로시저의 첫번째인 A를 담게 되며 재귀를 호출하게 된다.

 

재귀를 호출해서 올라가면 A와 그다음 for 문의 변수 i가 1에서 2로 변화되어 값은 B가 되고 카운터는 2에서 1(cnt-1)이 되었으므로 AB가 출력된다. 그 다음 for문이 다시 돌게 되고 이번에는 A와 3번째인 C가 결합하게 된다.

이렇게 재귀가 종료가 되면 처음 재귀를 호출했던 이전 곳으로 돌아간다. 그래서 귀속부분이 반드시 있어야 하는 것이다.

재귀를 호출했던 부분이 A를 합치기 전 공백이었으니까. 그곳으로 돌아가서 for문을 수행한다. A의 다음은 B부분이니 이번에는 공백과 B와 결합이 되고 카운터는 2에서 다시 1로 바뀐 상태로 재귀를 호출하게 된다. 

그럼 B와 카운터가 다시 2에서 1이 되었으므로 B와 그다음인 C와 결합하여 출력하게 된다.

재귀를 종료하였으므로 다시 재귀를 호출했던 곳으로 온다. 그부분이 공백이고 for문 변수가 2인 상태로 돌아오게 된다.

for 문의 변수 역시 +1을 해서 계속 재귀를 호출하기에 3번을 호출하게 되면 마지막에 +1이 더해져서 4가 되어 하위프로시저를 종료하고 상위프로시저로 회기한다.

상위 프로시저는 마지막 for 문을 돌리고 하위 프로시저를 호출한다.

하위 프로시저의 조합은 공백인 상태에서 카운터 값은 3이 된다. 따라서 바로 하위프로시저의 재귀로 이르게 될것이고

조합문자에 for문의 첫번째인 A가 결합하여 재귀를 호출한다.

카운터는 3에서 2가 되었으나 역시 1이 아님으로 또 다시 재귀를 호출한다. 이때 기존에 조합된 것이 A이므로 다음인 B가 결합하게 되고 다시 재귀를 호출하게 된다.

호출되면 카운터가 이번에는 2에서1이 됨으로 AB와 마지막 문자인 C와 결합하여 종료를 한후 카운터가 3이기에 재귀를 2번 호출하였느니 차례로 2번의 값들을 차례로 종료한 후 상위 프로시저로 회기하여 모든 구문을 종료하는 것이다.

환영한다.. 재귀영역에 들어온걸~~~

삼각형조합만들기(21.08.23).xlsm
0.02MB

댓글