본문 바로가기
의지박약/기본기가없다

[python] 피보나치수열을 굳이 클로저를 사용해서..

by 병진들 2021. 5. 13.

피보나치수는 0과 1로 시작하며 다음 피보나치수는 바로 앞의 두 피보나치 수의 합이 된다.

 

시간복잡도는 신경 안쓰고 그냥 클로저 라는 기능을 봤을때

피보나치수열이 생각나서 그냥 구현해봤다.

 

def fibo(f,b):
    front = f
    back  = b
    print(f"시작 값 1번째, 2번째 : {f}, {b}")
    result = 0
    def nacci():
        nonlocal front
        nonlocal back
        nonlocal result
        
        result = front + back
        front = back
        back = result
        return front, back, result

    return nacci

# 시작 값 입력 0,1
c = fibo(0,1)

# 10번만 돌려보자
for i in range(0,10):
    print(f"{i+3}번째: {c()[2]}")

 

 

클로저란 함수를 둘러싼 환경(지역변수 , 코드 등) 을 계속 유지하다가 , 함수들 호출할 때 다시 꺼내서 사용하는 함수를 클로저 라고 한다.

 

위 코드에서 C에 저장된 함수가 클로저가 되고

nonlocal로 변수를 선언해서 지역변수를 변경함

 

--- 뭘 잘못만졌는지 뒷 내용이 사라져있다.. 뭐지..? 수정 2021.10.25

 

위 코드에서 C에 저장된 함수가 클로저가 되고 

c = fibo(0, 1) 을 선언한 순간 class의 __init__처럼 초기화 되어 시작 값 "1번째, 2번째~" 가 출력된다.

 

그 이후로는 c가 nacci()함수가 되고 nonlocal로 선언한 지역 변수인 front, back, result에 계속 저장되면서 피보나치수열이 동작하게된다. 

 

또 클로저에 속한 지역변수는 바깥에서 직접 접근할 수 없어, 데이터를 숨기고 싶을 때 활용할 수 있다

 

 

 

 

결과

 

 

댓글