斐波那契数列
解法一:递归解法
def fib(n):
if n <= 1:
return n
else:
return fibo(n-1) + fibo(n-2)
print(fib(5))
递归解法其实比较简单的解法
但是它耗用的时间比较长
简而言之,它有一个递归树
读者画图就可以明白了,它递归的次数是2^n
解法二:备忘录解法
#带备忘录的递归算法
def fib(n):
memo=[ 0 for i in range(n+1)]
return helper(memo,n)
#这里的索引从1开始
def helper(memo,n):
if n==0 or n==1:
return n
if memo[n]!=0:
return memo[n]
memo[n]=helper(memo,n-1)+helper(memo,n-2)
return memo[n]
print(fib(4))
备忘录解法相对与递归在写法上比较复杂
备忘录的作用是将已经计算过的数值存储在列表里面
这样就可以防止递归树的产生,就只有一个递归链
递归的次数是n次
但是前两种方法都是从上到下,找到最底下的数值再往上进行遍历,计算次数较为多
解法三:动态规划
这是一个简易版
的动态规划算法
自底向上,逐步求和,这样可以节省计算机计算的很多步骤,提高速度
#动态规划
def fib(n):
if n==0:
return 0
dp=[0 for i in range(n+1)]
#基础数据
dp[0]=0
dp[1]=1
#状态转移
for i in range(2,n+1):
dp[i]=dp[i-1]+dp[i-2]
return dp[n]
print(fib(5))
或者
n = int(input())
F1, F2 = 1, 1
for i in range(3, n + 1):
F1, F2 = F2 , (F1 + F2)
print(F2)