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调用java的Webservice示例
Mar 10 Python
python实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
Python批量按比例缩小图片脚本分享
May 21 Python
python实现统计代码行数的方法
May 22 Python
Python实现合并字典的方法
Jul 07 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
python opencv如何实现图片绘制
Jan 19 Python
python 如何用map()函数创建多线程任务
Apr 07 Python
详解python网络进程
Jun 15 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
PHP中,文件上传
2006/12/06 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
jupyter安装小结
2016/03/13 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
最受欢迎的自我评价
2013/12/22 职场文书
护理工作感言
2014/01/16 职场文书
索桥的故事教学反思
2014/02/06 职场文书
个人优缺点总结
2015/02/28 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
自荐信范文
2019/05/20 职场文书
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android