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 文件与目录操作
Dec 24 Python
12步教你理解Python装饰器
Feb 25 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Python面向对象编程基础解析(一)
Oct 26 Python
python利用小波分析进行特征提取的实例
Jan 09 Python
带你认识Django
Jan 15 Python
python 猴子补丁(monkey patch)
Jun 26 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Python绘图实现显示中文
Dec 04 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
django自带的权限管理Permission用法说明
May 13 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 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/11/19 PHP
Symfony控制层深入详解
2016/03/17 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python引用DLL文件的方法
2015/05/11 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
python实现BackPropagation算法
2017/12/14 Python
Python实现全排列的打印
2018/08/18 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
计算机相关的自我评价
2014/01/15 职场文书
校园活动宣传方案
2014/03/28 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Vue的生命周期一起来看看
2022/02/24 Vue.js