第二章递归与分治策略(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• (3i)f(qn(n<, m) r=etqu(rnn, qm(–n,1n) )+; q(n–m, m), n>m>1 • (4ir)feqt(u(nnrn=, =mq()mn=,)mq(–rn1e,t)un+r)n,q1n(n<+–mmq(,。nm, n);–1);
}
8
多步递归
• 若递归函数f(x, y),其中y是递归元,不仅与 f(x, y–1)有关,而且与f(x, y–2),……,乃至 f(x, 0)有关,则称为多步递归。
第二章
递归与分治策略
1
Hanoi塔问题
• 例Ha1n:oi塔Ha的no解i塔可问以题很:自有然A地、看B、成C这三样根一柱个子过。程A: 上有n个圆盘,自下而上由大到小地叠在一起。
(个(11(12个)3现盘(圆不压(个盘)先13)再最盘))盘移要 移 盘 允 在将每 圆将后移移至将 到 ; 许 较A盘次A将至上C至上将 小AB(只只。C2B面B上剩上)上。较 的。任能能n下,的的–大圆何移在1的n并全的盘–时动A要部、圆上于v刻一o求圆是iB盘;d都个、:可H{}a得nio到fi((如HMHinnAaato>下nnnv0ooe,的)ii(i((Fn{nn程tr––oF序11,,,rBT,A:Foirns)os;t,,TTAoos,,si,FnCTrtooA));}s) C三个柱子间移动。
2
递归的概念
• 简单地说,递归就是用自己来定义自己。递归 算法是一个直接或间接地调用自己的算法。
• 一般地说,一个递归过程P可以表示为基语句 S(不含P)和P自身的组合β:
P β(S, P)
• 这样的表示包含了过程不终止的可能,因此递 归算法应更准确地表述为
P if B then Q else β(S, P)
T(n/2)
T(n/2)
T(n/2)
16
算法总体思想
• 对将这求k出个的子小问规题模分的别问求题解的。解如合果并子为问一题个的更规大模规仍模然的不问够 小题,的则解再,划自分底为向k上个逐子步问求题出,原如来此问递题归的的解进。行下去,直 到问题规模足够小,很容易求出其解为止。
n+2
n >= 2, m=0
A(A(n-1, m), m-1) n, m >= 1
Ackermann函数是一个双重的递归函数。
10
联立递归
• 联立递归是同时定义几个函数,它们彼 此相互调用,从而形成递归,又称间接 递归。
11
递归方法小结
• 递归方法是将复杂的问题分解为一些较为简单 的子问题的组合。这些子问题均与其相应的原 问题相同。
• 递归算法一定要有一个或几个最简单情况的计 算(非递归分支),如果缺少将造成递归不终止。
• 递归算法是有层次的,低层子问题的解组合成 高层问题的解。各层之间最好通过参数传递来 交流信息,如使用全局量,则要注意全局量的 及时修订。
12
递归小结
优点:结构清晰,可读性强,而且容易用 数学归纳法来证明算法的正确性,因此它 为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是 耗费的计算时间还是占用的存储空间都比 非递归算法要多。
• i最nt简q(单int情n,形i1n:t m(1)) q(n, 1)=1,q(1, mn )==11或n, m≥=11;
• •
{递 产q(iin归 生ff,((mnn关 的)=<系 新==1)情:1q1)||况(|((+|nm2(,:)qmm<(qn–=(1,n1=)n,)–+n11))q)(=rrnee–1ttumu+rrn,nqm0(1n;);, nnn>–≤1m)m,>n1>1;
• 正 例整 如ρ数(6n)的=一11个,这即种整表数示6的称划为分正数整为数1n1的种一:个 划6, 分。5+正1, 整4数+2n,的4+不1+同1的, 划3+分3,的3+个2+数1,成3+为1正+1整+1 数2+n2的+2划, 2分+2数+1,+1记, 2作+1ρ+(n1)+。1+1, 1+1+1+1+1+1
13
递归小结
解决方法:在递归算法中消除递归调用,使其转化为 非递归算法。 1、采用一个用户定义的栈来模拟系统的递归调用工作 栈。该方法通用性强,但本质上还是递归,只不过人 工做了本来由编译器做的事情,优化效果不明显。 2、用递推来实现递归函数。 3、通过变换能将一些递归转化为尾递归,从而迭代求 出结果。
其中Q也不包含P,B为递归终止条件。
3
递归元
• 递归算法的思想是将对较大规模的对象的操作 归结为对较小规模的对象实施同样的操作。
• 这种规模的变化就体现在递归算法的变元中的 一类(一个或几个)变元上,这类变元被称之为 递归元。
• 递归元的变化是在递归定义中确定的,它的变 化应能导致递归算法的终止。
• 例如Fibonacci函数:
1
n=0
F(n) = 1
n=1
F(n–1) + F(n–2) n > 1
Fibonacci函数是一个两步的递归函数。
9
嵌套递归
• 所谓嵌套递归是指递归调用中又含有递归调用, 又称为多重递归。
• 例如Ackermann函数:
2
n=1, m=0
A(n, m) = 1
m>= 0, n = 0
6
正整数的划分
• 有时候,问题本身具有比较明显的递归 关系,因而容易用递归函数直接求解。
• 在本例中,如果设p(n)为正整数n的划分 数,则难以直接找到递归关系。
7
正整数的划分
• 因此考虑增加一个自变量:在正整数的所有
不同划分中,将最大加数n1不大于m的划分个 数记为q(n, m),可以建立如下的二递元归递关归系函:数:
后两种方法在时空复杂度上均有较大改善,但其适 用范围有限。
14
分治法
15
算法总体思想
• •对小到将 子这,问要问k则题个求题再规子解。划模问的分足题较为够分大k小别个规,求子模很解问的容。题问易如,题求果如分出子此割其问递成解题归k为个的的止更规进。小模行规仍下模然去的不,够直
T(n)
=n
T(n/2)
• 在递归算法的设计中递归元是非常重要的。
4
常见的递归Baidu Nhomakorabea式
• 除基本的递归形式外,其它常见的递归 形式有四种,它们是: • 多变元递归; • 多步递归; • 嵌套递归; • 联立递归
5
多变元递归
•• 多例变2:元整递数归划就分是问递题归:元将多一于个一正个整的数递n归表。示为 一系列正整数之和, n = n1 + n2 +…+nk 其中n1≥n2≥…≥nk≥1, k≥1。