分析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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
python遍历文件夹下所有excel文件
Jan 03 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
pycharm的console输入实现换行的方法
Jan 16 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
python3调用windows dos命令的例子
Aug 14 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
详解使用scrapy进行模拟登陆三种方式
Feb 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
php实现简易计算器
2020/08/28 PHP
PHP反射基础知识回顾
2020/09/10 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
7个去伪存真的JavaScript面试题
2016/01/07 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
Vue精简版风格概述
2018/01/30 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python通过socket查询whois的方法
2015/07/18 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
Python Flask框架扩展操作示例
2019/05/03 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
美国最大网上鞋店:Zappos
2016/07/25 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
导游的职业规划书范文
2013/12/27 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
罚站检讨书
2015/01/29 职场文书
幼师个人总结范文
2015/02/28 职场文书
日元符号 ¥
2022/02/17 杂记