Python 재귀에서의 global 활용
재귀에서 global ( 전역 변수 ) 활용 전에 우선 지역 변수와 전역 변수가 무엇인지 말씀드린 뒤, global 이 무엇인지, 이를 어떻게 재귀에서 활용할 수 있는지 말씀드리도록 하겠습니다.
지역 변수( local variable )와 전역 변수( global variable )
함수안에서 정의되는 변수를 지역 변수 ( e.g. 아래 예시에서 local_var )라 하고 이는 함수 내에서만 존재합니다. 즉 함수 바깥에서 print( local_var ) 와 같이 함수 안에서 정의된 지역 변수 ( local_var )를 불러오면 ' NameError: name 'local_var' is not defined ' 와 같은 에러가 발생하게 됩니다.
이와 반대로 함수 바깥에서 정의되는 함수를 전역 변수 ( e.g. 아래 예시에서 global_var ) 라 하는데, 이는 함수 바깥에서 정의되고 아래 예시와 같이 함수 안에서도 이용할 수 있습니다.
global_var = 3
def test( ) :
local_var = 5
print('local_var + global_var : ', local_var + global_var)
return local_var + global_var
test( )
## out ##
local_var + global_var : 8
* 함수 안에 전역 변수와 동일한 이름의 지역 변수가 정의된다면 함수 내에서는 지역 변수를 이용하게 됩니다. 아래와 같이 함수 내에서 전역 변수와 이름이 같은 지역 변수가 정의되면 함수 내에서는 지역 변수를 이용합니다.
global_var = 3
def test( ) :
global_var= 1 # 전역 변수와 이름이 같은 지역 변수
local_var = 5
print('local_var + global_var : ', local_var + global_var)
return local_var + global_var
test( )
## out ##
local_var + global_var : 6
global
코딩을 하고 있다가 함수 내에 있는 지역 변수를 함수 바깥에서도 부르고 싶은 경우가 있는데, 이때 global 을 이용하면 됩니다. 아래 예시와 같이 전역 변수로 설정하고 싶은 지역 변수 앞에 global 을 통해 선언합니다. global 을 통해 전역 변수가 된 지역 변수는 함수 바깥에서 print( local_var ) 와 같이 호출해도 함수 내의 값이 호출 되게 됩니다.
global_var = 3
def test( ) :
global local_var
local_var = 5
print('local_var + global_var : ', local_var + global_var)
return local_var + global_var
test()
## out ##
local_var + global_var : 8
print('local_var : ', local_var)
## out ##
local_var : 5
재귀에서의 global 활용
재귀에서 무한으로 재귀하는 것을 막기 위해 termination condition 을 작성해야 합니다. 무한 재귀를 종료하는 것 뿐만 아니라 termination condition 을 만족하는 경우가 발생했을 때 termination condition이 발생했음을 저장하고 싶을 때가 있습니다. ( 별도의 코딩을 하지 않는다면 이는 그저 termination 되는 것 말고 표시가 되지 않습니다. ) 아래 예시와 같이 global 을 이용한다면 termination condition 을 만족하는 경우가 발생했을 때 그 발생을 기록할 수 있습니다.
IsCycle = False # cycle 이 발생하지 않은 것을 기본 값으로 지정
def cycle_check( arcs, stack, edge ) :
if edge in stack : # cycle이 발생했다면
global IsCycle # IsCycle 을 전역 변수로 설정하고 True 로 설정
IsCycle = True # IsCycle 값을 True 변경하여 termination condition 발생함을 알림
return True
stack.append( edge )
successive_edges = [ arc for arc in arcs if arc[0] == edge[1] ]
for edge in successive_edges :
cycle_check( arcs, stack, edge )
stack.pop()
return IsCycle
t = [ (1,2), (1,5), (2,3), (3,1) ]
cycle_check( t, [], (3,1) )
## out ##
True
'Python > Python 기타' 카테고리의 다른 글
Python @property , @property.setter 간단 정리 (0) | 2023.03.05 |
---|---|
한 줄로 Euclidean distance matrix 만들기 (Python) (0) | 2021.09.27 |
Python List append vs Pandas DataFrame append 속도 비교 (2) | 2021.07.10 |
cmd 통해 자동으로 주피터 노트북(jupyter notebook brower) 띄우기 (0) | 2021.01.08 |
Python 주피터 노트북 Markdown 위첨자 아래첨자 작성법 (0) | 2020.09.16 |