python利用高阶函数实现剪枝函数


Posted in Python onMarch 20, 2018

本文为大家分享了python利用高阶函数实现剪枝函数的具体代码,供大家参考,具体内容如下

案例:

       某些时候,我们想要为多个函数,添加某种功能,比如计时统计,记录日志,缓存运算结果等等

       需求:

              在每个函数中不需要添加完全相同的代码

如何解决?

       把相同的代码抽调出来,定义成装饰器

              求斐波那契数列(黄金分割数列),从数列的第3项开始,每一项都等于前两项之和

      

求一个共有10个台阶的楼梯,从下走到上面,一次只能迈出1~3个台阶,并且不能后退,有多少中方法?

       上台阶问题逻辑整理:

              每次迈出都是 1~3 个台阶,剩下就是 7~9 个台阶

                     如果迈出1个台阶,需要求出后面9个台阶的走法

                     如果迈出2个台阶,需要求出后面8个台阶的走法

                     如果迈出3个台阶,需要求出后面7个台阶的走法

              此3种方式走法,通过递归方式实现,递归像树,每次递归都生成子节点函数

以上两个问题通过递归来解决,就会出现一个问题,出现重复求解问题,把重复求解的过程剔除掉,在c++语言中称为剪枝函数

#!/usr/bin/python3
 
 
def jian_zhi(func):
  # 中间字典,判断已经是否求解过
  median = {}
   
  def wrap(*args):
    # 假如不在中间字典中,说明没有求解过,添加到字典中去,在的话,直接返回
    if args not in median:
      median[args] = func(*args)
    return median[args]
  return wrap
 
@jian_zhi
def fibonacci(n):
  if n <= 1:
    return 1
  return fibonacci(n-1) + fibonacci(n-2)
 
@jian_zhi
def climb(n, steps):
  count = 0
  # 当最后台阶为0的时候,说明最后只是走了一次
  if n == 0:
    count = 1
  # 当最后台阶不为0的时候,说明还需要走至少一次
  elif n > 0:
    # 对三种情况进行分别处理momo
    for step in steps:
      count += climb(n-step, steps)
       
  # 返回每次递归的计数
  return count
 
if __name__ == '__main__':
  print(climb(10, (1, 2, 3)))
  print(fibonacci(20))

所谓的剪枝函数不过是保证每次递归的函数唯一性,利用中间字典保存已经执行过得函数和参数,通过判断参数,剔除重复的函数调用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python程序设计入门(4)模块和包
Jun 16 Python
python实现封装得到virustotal扫描结果
Oct 05 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
django定期执行任务(实例讲解)
Nov 03 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
解决DataFrame排序sort的问题
Jun 07 Python
python查看模块安装位置的方法
Oct 16 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
python 破解加密zip文件的密码
Apr 22 Python
详解Python为什么不用设计模式
Jun 24 Python
解析目标检测之IoU
Jun 26 Python
python flask中静态文件的管理方法
Mar 20 #Python
python web基础之加载静态文件实例
Mar 20 #Python
python如何修改装饰器中参数
Mar 20 #Python
python MySQLdb使用教程详解
Mar 20 #Python
django中的HTML控件及参数传递方法
Mar 20 #Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 #Python
python如何定义带参数的装饰器
Mar 20 #Python
You might like
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP SQLite类
2009/05/07 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
Vue 全局loading组件实例详解
2018/05/29 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python 读取文件并替换字段的实例
2018/07/12 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
公司新员工的演讲稿注意事项
2014/01/01 职场文书
经典婚礼主持词
2014/03/13 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS