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数据结构之链表的实例讲解
Jul 25 Python
python 删除非空文件夹的实例
Apr 26 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
Python3安装pip工具的详细步骤
Oct 14 Python
Python统计时间内的并发数代码实例
Dec 28 Python
什么是python的id函数
Jun 11 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
python 生成器需注意的小问题
Sep 29 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
python迷宫问题深度优先遍历实例
Jun 20 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP 面向对象详解
2012/09/13 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
python装饰器decorator介绍
2014/11/21 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Django组件cookie与session的具体使用
2019/06/05 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
保送生自荐信范文
2013/10/06 职场文书
研究生求职推荐信范文
2013/11/30 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
决心书范文
2014/03/11 职场文书
公司会议开幕词
2015/01/29 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电