分析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中apply函数的用法实例教程
Jul 31 Python
使用Python实现一个简单的项目监控
Mar 31 Python
Python中实现三目运算的方法
Jun 21 Python
python requests 使用快速入门
Aug 31 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
Django自定义用户认证示例详解
Mar 14 Python
Python OpenCV读取png图像转成jpg图像存储的方法
Oct 28 Python
linux中如何使用python3获取ip地址
Jul 15 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
tensorflow 实现打印pb模型的所有节点
Jan 23 Python
python图片指定区域替换img.paste函数的使用
Apr 09 Python
使用darknet框架的imagenet数据分类预训练操作
Jul 07 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基础学习之流程控制的实现分析
2013/04/28 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
PHP中cookie知识点学习
2018/05/06 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
python实现简单socket通信的方法
2016/04/19 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
python队列原理及实现方法示例
2019/11/27 Python
Python telnet登陆功能实现代码
2020/04/16 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
学生个人的自我评价分享
2013/11/05 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android