分析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中的面向对象编程详解(上)
Apr 13 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
Python实现的txt文件去重功能示例
Jul 07 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
python tkinter基本属性详解
Sep 16 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 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
多重?l件?合查?(二)
2006/10/09 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php反射应用示例
2014/02/25 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
Ionic快速安装教程
2016/06/03 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
学习普通话的体会
2014/11/07 职场文书
2014年工程工作总结
2014/11/25 职场文书
销售助理岗位职责
2015/02/11 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
追悼词范文大全
2015/06/23 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android