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 相关文章推荐
Django 2.0版本的新特性抢先看!
Jan 05 Python
python最长回文串算法
Jun 04 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
Python银行系统实战源码
Oct 25 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
Django使用Profile扩展User模块方式
May 14 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
Pycharm github配置实现过程图解
Oct 13 Python
python网络爬虫实现发送短信验证码的方法
Feb 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
onpropertypchange
2006/07/01 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
外贸公司实习自我鉴定
2013/09/24 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android