斐波那契数列的多种解法 递归和动态规划

举报
nineteens 发表于 2021/03/04 22:01:57 2021/03/04
【摘要】 斐波那契数列的多种解法 递归和动态规划

  斐波那契数列的多种解法 递归&动态规划

  斐波那契数列:

  0、1、1、2、3、5、8、13、21、34

  递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

  # -*- coding: utf-8 -*-

  """

  Created on Wed Mar 3 10:58:27 2021

  @author: dujidan

  """

  from collections import defaultdict

  # 递归解法

  def fib(n):

  if n < 1:

  return 0

  if n == 1 or n == 2:

  return 1

  return fib(n - 1) + fib(n - 2)

  # 带备忘录的递归解法

  def fib(n):

  if n < 1:

  return 0

  meno_dict = {}

  return helper(meno_dict, n)

  def helper(meno_dict, n):

  if n == 1 or n == 2:

  return 1

  if n in meno_dict.keys():

  return meno_dict[n]

  else:

  meno_dict[n] = helper(meno_dict, n -1) + helper(meno_dict, n -2)

  return meno_dict[n]

  # 动态规划一般都脱离了递归, 由循环迭代完成计算

  # 数组迭代解法 动态规划

  def fib(n):

  dp_dict = defaultdict(int)

  dp_dict[1] = 1

  dp_dict[2] = 1

  for i in range(3, n+1):

  dp_dict[i] = dp_dict[i - 1] + dp_dict[i - 2]

  return dp_dict[n]

  # 当前状态只和之前的两个状态有关, 其实并不需要那么个 DP table 来存储所有的状态, 只要想办法存储之前的两个状态

  # 所以, 可以进一步优化, 把空间复杂度降为 O(1)

  def fib(n):大连做人流多少钱 http://www.120wtrlyy.com/

  if n == 1 or n == 2:

  return 1

  prev = 1; curr = 1

  for i in range(3, n+1):

  sum_num = prev + curr

  prev = curr

  curr = sum_num

  return curr

  print(fib(200))

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。