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时间模块中的datetime模块
Jan 13 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
Python Json数据文件操作原理解析
May 09 Python
python可迭代对象去重实例
May 15 Python
详解Python多线程下的list
Jul 03 Python
Python实现自动装机功能案例分析
Oct 22 Python
Python实现双向链表基本操作
May 25 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 curl参数的详解
2013/06/17 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
用python写asp详细讲解
2013/12/16 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
python中time、datetime模块的使用
2020/12/14 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
心理健康心得体会
2014/01/02 职场文书
大学生村官任职感言
2014/01/09 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
通信工程专业求职信
2014/06/04 职场文书
学习与创新自我评价
2015/03/09 职场文书
后天观后感
2015/06/08 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
《给予树》教学反思
2016/03/03 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电