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 re正则表达式模块(Regular Expression)
Jul 16 Python
Python装饰器的函数式编程详解
Feb 27 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
深入理解Django中内置的用户认证
Oct 06 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
Python restful框架接口开发实现
Apr 13 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 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
综合图片计数器
2006/10/09 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
Mootools 1.2教程 函数
2009/09/15 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
详解如何运行vue项目
2019/04/15 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
将python图片转为二进制文本的实例
2019/01/24 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
如何定义一个可复用的服务
2014/09/30 面试题
2014年国庆节寄语
2014/09/19 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
Django实现翻页的示例代码
2021/05/24 Python
利用Python实现Picgo图床工具
2021/11/23 Python
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python