分析python动态规划的递归、非递归实现


Posted in Python onMarch 04, 2018

概要

本文只是简单的介绍动态规划递归、非递归算法实现

案例一

题目一:求数组非相邻最大和

[题目描述]

在一个数组arr中,找出一组不相邻的数字,使得最后的和最大。

[示例输入]

arr=1 2 4 1 7 8 3

[示例输出]
15

from functools import wraps
def memoDeco(func):
  '''
  memoDeco主要是缓存已遍历的节点,减少递归内存开销
  '''
  cashe={}
  @wraps(func)
  def wrapper(*args):
    if args not in cashe:
      cashe[args]=func(*args)
    return cashe[args]
  
  return wrapper

@memoDeco
def recMaxArray(array,index):
  if index==0:
    return array[0]
  elif index==1:
    return max(array[0],array[1])
  else:
    return max(recMaxArray(array,index-2)+array[index],recMaxArray(array,index-1))
  
if __name__=="__main__":
  array=(1,2,4,1,7,8,3)
  print(recMaxArray(array,len(array)-1))

非递归实现

def dpMaxArray(array):
  '''
  代码讲解详见引用一:正月点灯笼讲解
  '''
  lens=len(array)
  maxArray=[0]*(lens)
  maxArray[0]=array[0]
  maxArray[1]=max(array[0],array[1])
  for i in range(2,lens):
    maxArray[i]=max(maxArray[i-2]+array[i],maxArray[i-1])
  return maxArray[-1]

  
if __name__=="__main__":
  array=(1,2,4,1,7,8,3)
  print(dpMaxArray(array))

案例二

[题目描述]

给定一个正整数s, 判断一个数组arr中,是否有一组数字加起来等于s。

[示例输入]

arr=3 34 4 12 5 3

s=9

[实例输出]

true

递归实现

from functools import wraps

#和第一题一样,套用装饰器可以做一个缓存节点作用
def memoDeco(func):
  '''
  memoDeco主要是缓存已遍历的节点,减少递归内存开销
  '''
  cashe = {}
  
  @wraps(func)
  def wrapper(*args):
    if args not in cashe:
      cashe[args] = func(*args)
    return cashe[args]
  
  return wrapper


@memoDeco
def recSubSet(arr, index, tar_num):
  if index == 0:
    return arr[0] == tar_num
  elif tar_num == 0:
    return True
  elif arr[index] > tar_num:
    return recSubSet(arr, index - 1, tar_num)
  else:
    return recSubSet(arr, index - 1, tar_num) or recSubSet(arr, index - 1, tar_num - index)


if __name__ == "__main__":
  arr = (3, 34, 4, 12, 5, 3)
  tar_num = 13
  index = len(arr) - 1
  print(recSubSet(arr, index, tar_num))

非递归实现

'''
多维数组构建用python第三方库numpy比较方便
代码讲解详见引用一:正月点灯笼讲解
'''
import numpy as np


def dpSubSet(arr, tar_num):
  subSet = np.zeros((len(arr), tar_num + 1), dtype=bool)
  subSet[:, 0] = True
  subSet[0, :] = False
  subSet[0, arr[0]] = True
  for i in range(1, len(arr)):
    for j in range(1, tar_num + 1):
      if arr[i] > j:
        subSet[i, j] = subSet[i - 1, j]
      else:
        subSet[i, j] = subSet[i - 1, j] or subSet[i - 1, j - arr[i]]
  return subSet[-1, -1]


if __name__ == "__main__":
  arr = (3, 34, 4, 12, 5, 3)
  tar_num = 13
  print(dpSubSet(arr, tar_num))
Python 相关文章推荐
python使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
python清理子进程机制剖析
Nov 23 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Mac安装python3的方法步骤
Aug 09 Python
Python内置加密模块用法解析
Nov 25 Python
python装饰器原理与用法深入详解
Dec 19 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
python speech模块的使用方法
Sep 09 Python
Python3 使用pip安装git并获取Yahoo金融数据的操作
Apr 08 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 Python
Python中的 No Module named ***问题及解决
Jul 23 Python
python3.x上post发送json数据
Mar 04 #Python
python数据封装json格式数据
Mar 04 #Python
Python爬虫实例扒取2345天气预报
Mar 04 #Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 #Python
浅析python实现scrapy定时执行爬虫
Mar 04 #Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 #Python
Python爬虫框架Scrapy实例代码
Mar 04 #Python
You might like
php Calender(日历)代码分享
2014/01/03 PHP
php使用qr生成二维码的示例分享
2014/01/20 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php实现微信发红包功能
2018/07/13 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
JS实现倒计时图文效果
2018/11/17 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
python笔记(2)
2012/10/24 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
旅游管理专业生自荐信范文
2014/01/02 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
委托书范本
2014/04/02 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
期末考试复习计划
2015/01/19 职场文书