分析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计算一个文件里字数的方法
Jun 15 Python
Python利用前序和中序遍历结果重建二叉树的方法
Apr 27 Python
Python 登录网站详解及实例
Apr 11 Python
Python使用sorted排序的方法小结
Jul 28 Python
BP神经网络原理及Python实现代码
Dec 18 Python
python sorted函数的小练习及解答
Sep 18 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 Python
使用Python将语音转换为文本的方法
Aug 10 Python
解决Pytorch中关于model.eval的问题
May 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
PHP4中实现动态代理
2006/10/09 PHP
php sprintf()函数让你的sql操作更安全
2008/07/23 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
Python yield使用方法示例
2013/12/04 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
python字符串判断密码强弱
2020/03/18 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
CSS3的Border-radius轻松制作圆角
2012/12/24 HTML / CSS
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
房地产销售经理岗位职责
2014/01/01 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
玲玲的画教学反思
2014/02/04 职场文书
建设工程授权委托书
2014/09/22 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL