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 相关文章推荐
Linux CentOS7下安装python3 的方法
Jan 21 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
Python创建字典的八种方式
Feb 27 Python
详解python解压压缩包的五种方法
Jul 05 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
NumPy统计函数的实现方法
Jan 21 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
Python中Selenium对Cookie的操作方法
Jul 09 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
使用adodb lite解决问题
2006/12/31 PHP
PHP生成带有雪花背景的验证码
2008/09/28 PHP
php使用百度天气接口示例
2014/04/22 PHP
YII框架常用技巧总结
2019/04/27 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
webpack之devtool详解
2018/02/10 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Python异常处理知识点总结
2019/02/18 Python
python多线程并发及测试框架案例
2019/10/15 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
大二自我鉴定
2014/01/31 职场文书
交通事故私了协议书
2014/04/16 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
学习党史心得体会2016
2016/01/23 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang