【Python算法】递归与递归式

该树结构显示了从1(根节点)到n(n个叶节点)的整个倍增过程。节点下的标签表示从n减半到1的过程。
当我们处理递归的时候,这些级数代表了问题实例的数量以及对一系列递归调用来说处理的相关工作量。
当我们需要找出全部的工作量时,我们需要用到树的高度以及每一层所处理的工作量。每一层总共的标志总数保持在n。
Recursion and Recurrences
def S(seq,i=0):
if i==len(seq):return 0
return S(seq,i+1)+seq[i]
该求和式从参数i开始,当其值超出目标序列时,函数返回0;否则将i的位置加i,继续求剩下序列的和。
计算 S(seq,i) 所需要的时间T(n)等于递归调用 S(seq,i+1) 所需要的时间加上访问 seq[i] 所需的时间。(默认T(k) = Θ(1) , k为常数)
可以定义为 T(n) = T(n-1) + 1
目标是把递归展开的层数用一个变量i来描述的表达式。
将原式中的n值替换为n-1可得 : T(n-1) = T(n-2) + 1

假设T(n)递归展开式次数为i,可得:
T(n) = T(n-i) + i
然后将T(n-i) 变成 T(i)

所以,函数S是一个线性级的运行时间的操作。
这种方法称为重复带入法,或者迭代法。一般分为以下步骤:
逐步展开递归式,一直到我们发现其中的模式为止。
将该模式表示出来(通常会涉及一个求和式)并用变量i来表示其行号。
根据i层递归将会达到基本情况来选择i的值(并解决该求和式)。
A Few Important Examples
递归式的一般形式: T(n) = a · T(g(n)) + f(n),a指递归调用的数量,g(n)递归过程所要解决的子问题大小,f(n)代表了函数中的额外操作。


递归式5:
T(n) = T(n/2) + 1
= { T(n/4) + 1 } + 1
= { T(n/8) + 1 } + 1 + 1

令i=lgn ,得到 T(n) = Θ(lgn)
递归式6:


if k is a height, then n/2k is the number of nodes at that height . T(n) = Θ(n)
递归式8:


递归树根节点上操作时间为n,后面的两次递归调用中,各自执行的都是减半操作,各节点的操作时间等于标签值。
每一行的和为n,并且有lgn+1行节点,得出总和为nlgn+n,Θ(nlgn)。
The Master Theorem 主定理
递归式与分治法存在的一般关系式为: T(n) = aT(n/b) + f(n)
主要思想为:有a重调用,每重调用处理掉一定比例的数据(数据集的1/b),还存在一个额外的f(n)操作。

三种基本情况:
大部分操作都是运行在根节点上
大部分操作运行在叶节点上
均匀分布在该递归树的各行之间
①、大部分操作都是运行在根节点上,总运行时间为Θ(f(n))
意味着:f(n)增长趋势将严格快于叶节点数的增长。
T(n) = Θ(f(n)) = Θ(n),如果看到b大于a,就立即可以确定n属于表达式的主导部分
②、大部分操作运行在叶节点上

例如:T(n) = 2T(n/2)+ lgn ,叶子节点数为n,f(n)=lgn,运行时间就是计算叶节点数的时间 Θ(n)。
③、均匀分布在该递归树的各行之间
求该树各层操作之和的求和式


Merge Sort, 归并排序例子:

The input (seq) has a size of n. There are two recursive calls, each on a subproblem of n/2
In addition, there is some work performed in a while loop and in res.reverse(); this work is Θ(n).
This gives us the well-known recurrence number 8, T(n) = 2T(n/2) + Θ(n), which means that the running time of merge sort is Θ(n lg n),
Summer
The sum of the n first integers is quadratic, and the sum of the lg n first powers of two is linear.
The first of these identities can be illustrated as a round-robin tournament, with all possible pairings of n elements;
the second is related to a knockout tournament, with lg n rounds, where all but the winner must be knocked out.
A function is recursive if it calls itself (directly or via other functions).
A recurrence relation is an equation that relates a function to itself, in a recursive way (such as T(n) = T(n/2) + 1).
These equations are often used to describe the running times of recursive algorithms, and to be able to solve them, we need to assume something about the base case of the recursion;
【Python算法】递归与递归式的更多相关文章
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- Python之函数的递归、匿名函数、内置函数
一.函数的递归 ''' 1 什么是函数递归 函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调 ...
- 算法打基础——符号&递归解法
第二节 算法复杂度分析的的基本符号及 递归关系式下的复杂度解法 这次的主要知识点是: 1.各种复杂度符号 2.递归复杂度解法: 分为三种 替换法(猜!) 递归树法 主定理 1各种复杂度符号 ...
- python学习:函数的递归调用
计算阶层 普通方法: -使用循环 #!/usr/bin/python def factorial(n): sum = 1 for i in range(1,n+1): ...
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
- Python基础之初识递归
初识递归 递归的定义: 在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归. 递归的最大深度--997 递归函数不受外力的阻止会一直执行下去,python为了杜绝此类现象,强制将递归层 ...
- Python之文件处理-递归删除特定文件
Python之文件处理-递归删除特定文件 #!/usr/bin/env python # -*- coding:utf-8 -*- import os def delete_particular_fi ...
- Python中的函数递归思想,以及对比迭代和递归解决Fibonacci数列
什么是递归?简单的说就是:函数自身调用自身. “普通程序员用迭代,天才程序员用递归” 虽然递归 在运行时会不断出栈压栈,调用底层的寄存器,造成空间上的占用以及时间上的缓慢, 但在一些算法上面仍然是递归 ...
- Java实现 蓝桥杯VIP 算法训练 非递归(暴力)
试题 算法训练 非递归 问题描述 当x>1时,Hermite多项式的定义见第二版教材125页.用户输入x和n,试编写"非递归"函数,输出对应的Hermite多项式的值.其中x ...
- 对于python装饰器结合递归的进一步理解
对于python装饰器结合递归的进一步理解 代码如下: import functools def memoize(fn): print('start memoize') known = dict() ...
随机推荐
- sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4
sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4是最官方的新版,免费开源,用官方最新发布原版汉化.未更改任何内核文件. Sphider 是一个完美的带有蜘蛛的搜索引擎程序. S ...
- 模板中的 TemplateBinding 问题
昨天一个朋友向我求助一个自定义水印控件绑定的问题,问题出在文本框中输入的文本,不能绑定到 相应的依赖属性上(自定义的依赖属性 PassText),他纠结了很久找不出问题所在.问题帮他解决后,这里稍 做 ...
- 【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
其实这是之前Michael_z 5篇文章的集合,但作者做了一些补充 参考重要安装文档:http://www.cnblogs.com/Michael_z/category/322108.html(本博客 ...
- 如果本身kali就在局域网,shell在外网,怎么反弹连接呢?
kali虚拟机使用桥接,路由器端口映射监听的端口即可.
- 未能加载文件或程序集“Autofac, Version=3.4.0.0,
遇到这个错误的时候:如下图 未能加载文件或程序集“Autofac, Version=3.4.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da” ...
- SpringMVC 之类型转换Converter 源代码分析
SpringMVC 之类型转换Converter 源代码分析 最近研究SpringMVC的类型转换器,在以往我们需要 SpringMVC 为我们自动进行类型转换的时候都是用的PropertyEdito ...
- 深度剖析ConcurrentHashMap(转)
概述 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到: HashMap是非线程安全的,HashTable是线程安全的. 那个时候没怎么写Java代码,所以根 ...
- Easyui 编辑表格行删除
1.问题描述 easyui 编辑表格新增一条数据后,删除最后一行删除不了,原因是没有提交数据acceptChanges. 源码中deleteRow方法,根据坐标获取行html,方法为opts.find ...
- 假设A.jsp内设定一个<jsp:useBean>元素:
假设A.jsp内设定一个<jsp:useBean>元素: <jsp:useBean id=”bean1” class=”myBean” /> 下列哪一个为真?(选择1项) A. ...
- 实现现下列哪一种接口的对象,并不需要在web.xml文件内进行额外的设定,Servlet容器就能够回应该对象加入HTTP会话所发生的事件?(选择1项)
实现现下列哪一种接口的对象,并不需要在web.xml文件内进行额外的设定,Servlet容器就能够回应该对象加入HTTP会话所发生的事件?(选择1项) A.ServletContextListener ...