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 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
对numpy的array和python中自带的list之间相互转化详解
Apr 13 Python
Python实现的质因式分解算法示例
May 03 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
Python如何调用JS文件中的函数
Aug 16 Python
python 日志 logging模块详细解析
Mar 31 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
Python3 webservice接口测试代码详解
Jun 23 Python
python源文件的字符编码知识点详解
Mar 04 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
jQuery类选择器用法实例
2014/12/23 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
canvas知识总结
2017/01/25 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
webpack优化的深入理解
2018/12/10 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
采购意向书范本
2014/03/31 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers