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中正则表达式的使用详解
Oct 17 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
python3解析库lxml的安装与基本使用
Jun 27 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
python能在浏览器能运行吗
Jun 17 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
Python Http请求json解析库用法解析
Nov 28 Python
Python非单向递归函数如何返回全部结果
Dec 18 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
360通用php防护代码(使用操作详解)
2013/06/18 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
JavaScript入门之基本函数详解
2011/10/21 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
JavaScript字符串对象
2017/01/14 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
JavaScript事件处理程序详解
2017/09/19 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
Python使用PIL模块生成随机验证码
2017/11/21 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
python实现淘宝购物系统
2019/10/25 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
护理专业毕业生推荐信
2013/10/31 职场文书
个人自荐信
2013/12/05 职场文书
婚礼主持词
2014/03/13 职场文书
中职招生先进个人材料
2014/08/31 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
汽车车尾标语大全
2015/08/11 职场文书
小学班级管理心得体会
2016/01/07 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书