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 03 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
Python端口扫描简单程序
Nov 10 Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
Python应用库大全总结
May 30 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
详解python pandas 分组统计的方法
Jul 30 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 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 empty() 检查一个变量是否为空
2011/11/10 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
小程序实现订单倒计时功能
2019/04/23 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
python练习程序批量修改文件名
2014/01/16 Python
Python的pycurl包用法简介
2015/11/13 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Django实现文件上传和下载功能
2019/10/06 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
企业管理毕业生求职信
2014/03/11 职场文书
企业安全生产责任书
2014/04/14 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
承诺函格式模板
2015/01/21 职场文书
股东出资协议书
2016/03/21 职场文书
学生会自荐信
2019/05/16 职场文书
PHP解决高并发问题
2021/04/01 PHP
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
MySQL读取JSON转换的方式
2022/03/18 MySQL
你真的会用Mysql的explain吗
2022/03/31 MySQL
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers
Redis 异步机制
2022/05/15 Redis