分析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常用的日期时间处理方法示例
Feb 08 Python
Python中文字符串截取问题
Jun 15 Python
python调用百度语音识别api
Aug 30 Python
python sort、sort_index方法代码实例
Mar 28 Python
python列表生成器迭代器实例解析
Dec 19 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
python中执行smtplib失败的处理方法
Jul 01 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
pycharm永久激活超详细教程
Oct 29 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
php 基础函数
2017/02/10 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
VBScript版代码高亮
2006/06/26 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
django2.0扩展用户字段示例
2019/02/13 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
化学相关工作求职信
2013/10/02 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
铲车司机岗位职责
2014/03/15 职场文书
平安建设工作方案
2014/06/02 职场文书
交流会主持词
2015/07/02 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers