分析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中的map()函数和reduce()函数的用法
Apr 27 Python
python中enumerate函数用法实例分析
May 20 Python
python 写入csv乱码问题解决方法
Oct 23 Python
Python使用wxPython实现计算器
Jan 30 Python
python实现手机通讯录搜索功能
Feb 22 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python滑块验证码的破解实现
Nov 10 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python中sympy库求常微分方程的用法
Apr 28 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 Python
如何把python项目部署到linux服务器
Aug 26 Python
python中的plt.cm.Paired用法说明
May 31 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
上海无线电三厂简史修改版
2021/03/01 无线电
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
浅谈React高阶组件
2018/03/28 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
python使用tkinter实现简单计算器
2018/01/30 Python
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
领班岗位职责范文
2014/02/06 职场文书
大学活动总结格式
2014/04/29 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python