分析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 相关文章推荐
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
python 调用c语言函数的方法
Sep 29 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
PyTorch加载预训练模型实例(pretrained)
Jan 17 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
Python通过Schema实现数据验证方式
Nov 12 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 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计数器的实现代码
2013/06/08 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
php微信开发之图片回复功能
2018/06/14 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python多进程实现文件下载传输功能
2018/07/28 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
养殖人员的创业计划书范文
2013/12/26 职场文书
消防安全检查制度
2014/02/04 职场文书
学生请假条
2014/04/11 职场文书
大学英语专业求职信
2014/06/21 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
电视新闻稿
2015/07/17 职场文书
村官2015年度工作总结
2015/10/14 职场文书
会计入职心得体会
2016/01/22 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技