分析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 正则表达式操作指南
May 04 Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python找出完数的方法
Nov 12 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
python 实现Requests发送带cookies的请求
Feb 08 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
与数据库连接
2006/10/09 PHP
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
用jQuery模拟页面加载进度条的实现代码
2011/12/19 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
Python中IPYTHON入门实例
2015/05/11 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
python删除某个字符
2018/03/19 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
对pandas中Series的map函数详解
2018/07/25 Python
实习生自我鉴定
2013/12/12 职场文书
红旗方阵解说词
2014/02/12 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
放飞理想主题班会
2015/08/14 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
PHP实现考试倒计时功能代码
2021/04/16 PHP
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
python 判断文件或文件夹是否存在
2022/03/18 Python