分析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 实现自动远程登陆scp文件实例代码
Mar 13 Python
Python实现发送QQ邮件的封装
Jul 14 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
Python中的并发处理之asyncio包使用的详解
Apr 03 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 Python
python井字棋游戏实现人机对战
Apr 28 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
php Smarty date_format [格式化时间日期]
2010/03/15 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
php单链表实现代码分享
2016/07/04 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
js函数般调用正则
2008/04/08 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python中的ctime()方法使用教程
2015/05/22 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
python爬虫解决验证码的思路及示例
2019/08/01 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
学生鉴定评语大全
2014/05/05 职场文书
医院党员公开承诺书
2014/08/30 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
JavaScript实现优先级队列
2021/12/06 Javascript
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers