날아라김지원
def recur(i):
	if i==100:
    	return
    print(i,'번째 재귀 함수를 호출합니다')
    recur(i+1)
    print(i,'번째 재귀종료')
    
recur(1)

이와같은 재귀함수가 있다고 치자 만약 4번째줄에 재귀함수가 호출 될 때마다 카운트를 하고싶다면 어떻게 해야할까?

 

다른언어들처럼 그냥 함수밖에 변수하나를 선언하고 카운팅을 하려고했는데 알고보니 파이썬은 그게 먹히지가 않더라...

 

종료직전에 return으로 카운트를 맥여도 될거같은데 적어도 나에게 직관적이진 않았다. 여튼 방법은 아래와 같다.

 

1.파이썬 전역변수 설정하는방법

global cnt
cnt = 0

def recur(i):
	if i==100:
    	return
    print(i,'번째 재귀 함수를 호출합니다')
    global cnt
    cnt +=1
    recur(i+1)
    print(i,'번째 재귀종료')
    
recur(1)
print(cnt)

정확히는 위와같이 사용하면 되지만 아래와같이 사용해도 이상하게 작동은 되었다.

cnt = 0

def recur(i):
	if i==100:
    	return
    print(i,'번째 재귀 함수를 호출합니다')
    global cnt
    cnt +=1
    recur(i+1)
    print(i,'번째 재귀종료')
    
recur(1)
print(cnt)

정확한 사용법은 다시 검색해 봐야겠지만 중요한건 다른 언어와 달리 전역변수를 global키워드와 같이 선언을 해주고 명시해줘야야줘야

 

사용할 수 있음을 알게되었다.

 

근데 ㅋㅋ 오죽하면 위 개념을 몰라서 카운팅을한게 급한대로 리스트를 선언해 1을 넣고 그 갯수를 센 방법이었다. ㅋㅋㅋ

 

lst = []
def recur(i):
	if i==100:
    	return
    print(i,'번째 재귀 함수를 호출합니다')
    lst.append(1) # 호출할 때마다 1을 넣는다.
    recur(i+1)
    print(i,'번째 재귀종료')
    
recur(1)
cnt = len(lst)
for i in lst:
	lst.pop()
print(cnt)

이와같은 방법으로 카운팅 했다. 그리고 다음 카운팅을 대비해 pop까지 ㅋㅋㅋ..... 하.. 

 

혹시나 js도이러나 싶어서 구현해봤지만 그냥 따로 전역변수 설정을 해줄 필요는 없었다.

 

 

2.javascript 전역변수 설정하는방법 (그냥)

cnt = 0

function dfs(i){
	if(i==10){
    	return
        }
        
    console.log(i,'번쨰 함수를 호출합니다')
    cnt +=1
    dfs(i+1)
    console.log(i,'번째 함수를 종료합니다')
    
}

dfs(1)
console.log(cnt)

아주 그냥 잘~ 되는 모습을 볼 수있다. 뭐 다른 방법이 있겠지만 극한의 직관성을 추구하는 나에게는 당황스러운 일이었다.

 

사실 내가 알고리즘 문제같은걸 그렇게 자주 즐겨푸는편도 아니라.... 신기했다.

profile

날아라김지원

@flykimjiwon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!