피보나치(Fibonacci) 수열을 구현하는 7가지 방법
현재 값 f(t)를 구함에 있어서, 바로 이전의 값 f(t-1), 그 이전..이전..의 값 f(t-2)을 더하는 방법으로 수를 생성
현재시간(t)의 함수를 f(t)로 표현
수열 예시
def fib(n):
a,b = 1,1
if n==1 or n==2:
return 1
for i in range(1,n):
a,b = b, a+b
return a
[ fib(x) for x in range(1,10) ]
def fib(n):
if n==1 or n==2:
return 1
else:
return fib(n-1) + fib(n-2)
fib(5)
COMMENT
개인적으로 재귀함수 방식을 좋아하지는 않습니다. 과거에 메모리를 많이 아껴야 하는 시절에는 많이 사용되었습니다만, 메모리가 충분히 성장한 요즘 시대에는 학습차원에서 공부하는 것은 좋지만, 현장에서 사용은 꺼리고 있습니다. 이유는, 재귀함수를 사용하면 가독성이 떨어집니다. 또한, 만약 실수하면 무한루프에 빠지게 되죠. 나중에 디버깅도 쉽지 않습니다. (코딩 인계라도 하는 날이면,,,,, ㅜ_ㅜ)
그러나, 알고리즘 문제는 빠지지 않고 출제되니, 시험을 위해서라면 공부해 두세요~
def fibs():
a,b = 0,1 // generator 출력할 때, next()로 다음것을 출력⇒ 한단계 늦춤
while True:
a,b = b, a+b
yield a
f = fibs()
next(f)
Out[1]: 1
def fibs():
a,b = 0,1
while True:
a,b = b, a+b
yield a
f = fibs()
next(f)
next(f)
next(f)
next(f)
next(f)
Out[1]: 5
데이터의 중요성 때문에, 데이터를 Array에 넣어 놓고 계산하는 방식으로 바뀌고 있음
피보나치 수열의 각 단계의 결과를 Array로 만들어 반환 하는 방식
"반복되는 수는 메모리에 저장해 두고, 반복 계산 대신 저장해둔 값을 사용한다"
피보나치 수열의 반복 계산
동적계획법(Dynamic Programming)을 사용한 피보나치 수열 계산: BottomUp 방식
동적계획법(Dynamic Programming: Bottom-Up 방식)으로 피보나치수열 구현
def fib(n):
fibList=[1, 1]
if n==1 or n==2:
return 1
for i in range(2,n):
fibList.append( fibList[i-1] + fibList[i-2] )
return fibList
fib(5)
Out[1]: [1, 1, 2, 3, 5]
fib = lambda n: 1 if n<=2 else fib(n-1) + fib(n-2)
fib(5)
fib = lambda n, a=0, b=1 : a if n<=0 else fib(n-1,b, a+b)
fib(5)
A = np.matrix( [ [1,1], [1,0] ] )
(A**5)[0,1]