分析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开发编码规范
Sep 08 Python
Python 连连看连接算法
Nov 22 Python
python client使用http post 到server端的代码
Feb 10 Python
python smtplib模块发送SSL/TLS安全邮件实例
Apr 08 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
Django 批量插入数据的实现方法
Jan 12 Python
Python的Tqdm模块实现进度条配置
Feb 24 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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+MySQL的聊天室设计
2006/10/09 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
php简单中奖算法(实例)
2017/08/15 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python gdal安装与简单使用
2019/08/01 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
python 实现超级玛丽游戏
2020/11/25 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
户籍证明的格式
2014/01/13 职场文书
项目考察欢迎辞
2014/01/17 职场文书
股份合作协议书范本
2014/04/14 职场文书
老公保证书范文
2014/04/29 职场文书
协会周年庆活动方案
2014/08/26 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
django上传文件的三种方式
2021/04/29 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server