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 操作MySQL详解及实例
Apr 30 Python
python基本语法练习实例
Sep 19 Python
关于python多重赋值的小问题
Apr 17 Python
python卸载后再次安装遇到的问题解决
Jul 10 Python
Django如何使用第三方服务发送电子邮件
Aug 14 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
python MD5加密的示例
Oct 19 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 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
用header 发送cookie的php代码
2007/03/16 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
对python中return和print的一些理解
2017/08/18 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python更改已存在excel文件的方法
2018/05/03 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
python 图像平移和旋转的实例
2019/01/10 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
面试复试通知单
2015/04/24 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
Python实现信息管理系统
2022/06/05 Python