22.09.28 TIL☁️

조배·2022년 9월 28일
0

TIL

목록 보기
4/30
post-thumbnail

Python

전역변수

리스트,딕셔너리는 mutable(변경가능한 객체) 이고, 일반적인 자료형(int,str)은 immutable(변경불가능한 객체)이다.

파이썬을 사용하면서 그냥 몸으로 터득한 정보가 몇 가지 있는데 오늘 그중 하나를 다룰까 한다.
바로 전역 변수인데, 솔직하게 말하자면 이게 왜 되는지 이유를 모르고 사용하고 있었다. 그냥 되거든..
알고리즘 문제를 풀다 보면 전역변수를 사용하는 경우가 꽤 있다.global 어쩌고저쩌고
근데 리스트의 경우는 전역변수 처리하지 않아도 변경할 수 있었다. 그래서 그냥 그런가 보다 하고 사용했고, 이번 기회에 확실하게 알고 넘어가고 싶었다.
내가 이해한 바를 쉽게 설명하자면 태생(?)이 다르므로 그렇다.
리스트나 딕셔너리는 변경이 가능한 객체(mutable)로 태어나고, int, str 등은 변경이 불가능한 객체(immutable)로 태어난다.
그래서 int, str, 튜플 등의 경우(immutable)에는 전역 변수 처리해줘야 변경이 가능했던 것이었다.

오늘의 TMI 😎

꼬리 재귀

오늘 소울메이트 써니와 꼬리 재귀에 대한 재미있는 토론을 하였는데 결론은 재귀의 무한 루프에 대한 단점을 상쇄시킬 정말 좋은 기능이지만 호환성을 따져봐야한다.
우리가 사용하던 파이썬의 경우 꼬리재귀를 지원하지 않는다.

며칠간 재귀 알고리즘을 보고 사용하면서 불안한 느낌을 많이 받았다.
사실 반복문으로도 구현할 수 있었기 때문에 재귀의 필요성을 고민하게 되었다.
하지만 가독성이 좋다는 것이 어마어마한 장점으로 다가왔기에 보완점을 찾게 되었고, 바로 꼬리 재귀였다.

# 일반적인 재귀
def fact(n):
    if n == 1:
        return 1
    return n * fact(n-1)

# 꼬리 재귀
def fact(n, res):
    if n == 1:
        return res
    return fact(n-1, res * n)

코드를 먼저 보고 파악하면 좋을 것 같다.
내가 이해한 바로는 일반적인 재귀는 return에 연산이 계속 남으면서 스택이 쌓인다.
스택이 많이 쌓이다 보면 stack overflow가 발생할 수 있다.
그 경우를 막아줄 수 있는 게 아래의 꼬리 재귀인데, 코드를 보면 재귀 호출 이후에 함수 안에서 연산하지 않는다.
사실 위의 코드로는 다 이해할 수 없어 컴파일러의 해석을 봐야 한다.

int FactorialTail(int n){
	int acc = 1;
    
    do{
    	if(n == 1) return;
        acc = acc * n;
        n = n - 1;
    } while(true);
} 

꼬리 재귀를 지원하는 경우에 스택이 쌓이지 않고, 단 한 번만 호출하는 것이다.
갑자기 Java가 나와서 의문일 수 있는데 바로 그것이 오늘의 핵심이다.
내가 다루는 파이썬은 아쉽게도 지원하지 않는다.
다시 한 번 강조하고 싶다. 꼬리 재귀 정말 좋지만, 호환성을 반드시 체크 해야 한다.
이걸 두고 성능이 왜 똑같지 이러쿵저러쿵 했다..
출처 :꼬리재귀에 대한 정말 좋은글

내일의 나에게🥲

  • 묻어뒀던 JWT 토큰 꺼내기..(프론트식 처리)
  • git pull request
profile
깃허브로 이전했습니다 -> https://chobae.github.io/

2개의 댓글

comment-user-thumbnail
2022년 9월 28일

잘 보고 갑니다 ^^

1개의 답글