分析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实现人人网登录示例分享
Jan 19 Python
Python类属性与实例属性用法分析
May 09 Python
python如何实现内容写在图片上
Mar 23 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
python监控文件并且发送告警邮件
Jun 21 Python
python查看列的唯一值方法
Jul 17 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
python实现学员管理系统
Feb 26 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
python 字典套字典或列表的示例
Dec 16 Python
python爬虫使用正则爬取网站的实现
Aug 03 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 获取目录下的图片并随机显示的代码
2009/12/28 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
layui实现点击按钮给table添加一行
2018/08/10 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
理解Python中的类与实例
2015/04/27 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
浅析Python面向对象编程
2020/07/10 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
Linux的主要特性
2014/10/06 面试题
市场部管理制度
2014/02/02 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js