10826:フィボナッチ数4
フィボナッチ数5は既に解決されていたので,コードをそのまま入れるとランタイムエラーが発生した.
Pythonの再帰深さのデフォルト値が1000に設定されているためです.
初めてやったことは復帰の深さを和らげることです。
(問題で要求されるnは10000であるため、制限は100000に増加する.)
(制限を増やしても、あまり深い再帰は実行されません(正しくありません).
import sys
sys.setrecursionlimit(100000)
def fibonacci(first_num, second_num, count) :
tmp = first_num + second_num
count -= 1
if (count > 0) :
return fibonacci(first_num = second_num,second_num= tmp, count= count)
else :
return tmp
n = int(input())
first = 0
second = 1
if(n == 0) :
print(0)
elif(n==1) :
print(1)
else :
result = fibonacci(first_num= first, second_num= second, count= n - 1)
print(result)
その結果、メモリオーバーフローが発生しました.2回目の試みは、ネット上で見つけた動的計画法です。
ダイナミックプランニング
簡単に言えば、大きな問題を次のような問題に分けて解決することです。
もっと分かりやすいのは、1つの問題は1回しかできないことです.
△特にフィボナッチ数列では、これが有効です.
上のフィボナッチ関数は指数形式の時間複雑度を有する.(約2^n)
だからある程度の大きな数字を入れるとプログラムが跳ね返る….
そこで,注釈(Memoization)技術を採用した.
我々が計算したFibonacci(2),Fibonacci(3)...再計算せずに関数(など)を呼び出します.
計算した関数の値を任意のスペースに格納し、再書き込みします。
これにより,関数再計算を呼び出す必要がなくなるので,指数形式の時間的複雑さをO(N)に著しく低減できる.
(fibonacci(10000)の場合は、10000回計算して保存した値を使用するだけです!)
# 재귀함수로는 메모리 초과, 시간 초과로 풀리지 않는다.
# fibonacci의 10000 번째 수는 생각보다 훨씬 더 큰 수였다..
# 이런 식으로 정보를 저장하며 풀어나가는 것을 동적계획법(Dynamic Programming)이라고 했다.
def fibonacci(count) :
first_num = 0
second_num = 1
for i in range(count) :
first_num, second_num = second_num, (first_num + second_num)
return first_num
n = int(input())
if(n == 0) :
print(0)
elif(n==1) :
print(1)
else :
result = fibonacci(count= n)
print(result)
このコードで10826:フィボナッチ数4の問題を解決しました!ダイナミックプランニング法の概念「大問題小問題解決」.この言葉はよく聞いたことがあるようですが、私は本当にどのように割って、どんな方法で解決するか分かりません.
私はもっと多くの問題をして、私に合った方法でそれを熟知します.
Reference
この問題について(10826:フィボナッチ数4), 我々は、より多くの情報をここで見つけました https://velog.io/@1984/10826-피보나치-수-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol