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中的__slots__使用示例
Feb 26 Python
Python编程中的for循环语句学习教程
Oct 14 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Django-Scrapy生成后端json接口的方法示例
Oct 06 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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
PHP字符串处理的10个简单方法
2010/06/30 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
小溪流的歌教学反思
2014/02/13 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
英文感谢信范文
2015/01/21 职场文书
社区党务工作总结2015
2015/05/19 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL