分析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实现在线程里运行scrapy的方法
Apr 07 Python
使用Python生成url短链接的方法
May 04 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
Python零基础入门学习之输入与输出
Apr 03 Python
用django设置session过期时间的方法解析
Aug 05 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
python线程里哪种模块比较适合
Aug 02 Python
Django数据统计功能count()的使用
Nov 30 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 22 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之第五天
2006/10/09 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
用jscript实现新建word文档
2007/06/15 Javascript
Javascript 对象的解释
2008/11/24 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
python opencv实现证件照换底功能
2019/08/19 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
python如何修改文件时间属性
2021/02/05 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
铭立家具面试题
2012/12/06 面试题
数控加工专业毕业生自荐信
2013/09/27 职场文书
应届生会计求职信
2013/11/11 职场文书
卖车协议书范例
2014/09/16 职场文书
会计出纳岗位职责
2015/03/31 职场文书
2015年材料员工作总结
2015/04/30 职场文书
办公室日常管理制度
2015/08/04 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS