递归与分治共62页文档
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 * fac(3) 3 * fac(2)
16
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
4 * fac(3) 3 * fac(2) 2 * fac(1)
17
def fac(N):
if N <= 1: return 1
边界条件 递归模式
27
Fibonacci数列
def Fibonacci(N): if N <= 1: return 1 else: return Fibonacci(N-2) + Fibonacci(N-1)
这段程序中什么是边界条件?什么是递归模式?你能模拟 一下这个程序的运行吗?
28
Hanoi塔问题
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
4 * fac(3)
15
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
4* 6
21
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * 24
22
def fac(N):
def fac(N):
if N <= 1: return 1
边界条件
else:
递归步骤
return N * fac(N-1)
11
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
>>> fac(1) Result: 1
初始条件没有问题!
33、如果惧怕前面跌宕的山岩,生命 就永远 只能是 死水一 潭。 34、当你眼泪忍不住要流出来的时候 ,睁大 眼睛, 千万别 眨眼!你会看到 世界由 清晰变 模糊的 全过程 ,心会 在你泪 水落下 的那一 刻变得 清澈明 晰。盐 。注定 要融化 的,也 许是用 眼泪的 方式。
35、不要以为自己成功一次就可以了 ,也不 要以为 过去的 光荣可 以被永 远肯定 。
29
Hanoi塔问题
• 一共有3个塔座,在一个塔座上有一叠圆盘, 这些圆盘自下而上,由大到小地叠在一起。要 求将塔座上的这一叠圆盘移到另一塔座上,并 仍按同样顺序叠置。
• 递归有两个基本要素:
1. 边界条件:确定递归到何时终止; 2. 递归模式:大问题是如何分解为小问题的。
26
Fibonacci数列
• 无穷数列1,1,2,3,5,8,13,21,34, 55,……,称为Fibonacci数列。
• 它可以递归地定义为:
1
n0
F (n)
1
n 1
F (n 1) F (n 2) n 1
递归完成了几乎所有的剩 余工作!
return N * fac(N-1)
24
递归函数设计
• 但是你也必须自己完成一步 def fac(N):
if N <= 1: return 1
else: return fac(N)
这样是无法工作的!
25
递归定义
• 递归(Recursion)就是子程序(或函数) 直接调用自己或通过一系列调用语句间接 调用自己,是一种描述问题和解决问题的 基本方法。
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) Result: 120
23
递归函数设计
挖掘自相似的特性 产生简介、优雅的代码
更少的工作!
def fac(N): if N <= 1:
你需要控制边界条件—— 也就是你能想到的最简单
的情况!
return 1 else:
12
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5)
13
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
14
def fac(N):
函数幕后
fac(5) 5 * fac(4)
4 * fac(3) 3 * fac(2) 2* 1
19
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)Fra bibliotek函数幕后
fac(5) 5 * fac(4)
4 * fac(3) 3* 2
20
def fac(N):
else: return N * fac(N-1)
函数幕后
“栈”
fac(5) 5 * fac(4)
4 * fac(3)
保存了所有对 fac的调用
3 * fac(2) 2 * fac(1)
1
18
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
递归与分治
德罗斯特效应
7
德罗斯特效应
8
设计递归函数
• 程序设计中如何设计这样的函数呢?
1 def fac(N):
2
return N * fac(N-1)
这个函数没有边界条件,函数fac的调用将无法终止。
一定要注意首先递归函数要有一个边界条件,之后
再考虑递归的步骤。
9
10
设计递归函数
在印度,有这么一个古老的传说: 在世界中心贝拿勒斯(在印度北部)的 圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候, 在其中一根针上从下到上地穿好了由大 到小的64片金片,这就是所谓的汉诺 塔。不论白天黑夜,总有一个僧侣在按 照下面的法则移动这些金片:一次只移 动一片,不管在哪根针上,小片必须在 大片上面。僧侣们预言,当所有的金片 都从梵天穿好的那根针上移到另外一根 针上时,世界就将在一声霹雳中消灭, 而梵塔、庙宇和众生也都将同归于尽。
递归与分治
31、别人笑我太疯癫,我笑他人看不 穿。(名 言网) 32、我不想听失意者的哭泣,抱怨者 的牢骚 ,这是 羊群中 的瘟疫 ,我不 能被它 传染。 我要尽 量避免 绝望, 辛勤耕 耘,忍 受苦楚 。我一 试再试 ,争取 每天的 成功, 避免以 失败收 常在别 人停滞 不前时 ,我继 续拼搏 。
16
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
4 * fac(3) 3 * fac(2) 2 * fac(1)
17
def fac(N):
if N <= 1: return 1
边界条件 递归模式
27
Fibonacci数列
def Fibonacci(N): if N <= 1: return 1 else: return Fibonacci(N-2) + Fibonacci(N-1)
这段程序中什么是边界条件?什么是递归模式?你能模拟 一下这个程序的运行吗?
28
Hanoi塔问题
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
4 * fac(3)
15
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
4* 6
21
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * 24
22
def fac(N):
def fac(N):
if N <= 1: return 1
边界条件
else:
递归步骤
return N * fac(N-1)
11
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
>>> fac(1) Result: 1
初始条件没有问题!
33、如果惧怕前面跌宕的山岩,生命 就永远 只能是 死水一 潭。 34、当你眼泪忍不住要流出来的时候 ,睁大 眼睛, 千万别 眨眼!你会看到 世界由 清晰变 模糊的 全过程 ,心会 在你泪 水落下 的那一 刻变得 清澈明 晰。盐 。注定 要融化 的,也 许是用 眼泪的 方式。
35、不要以为自己成功一次就可以了 ,也不 要以为 过去的 光荣可 以被永 远肯定 。
29
Hanoi塔问题
• 一共有3个塔座,在一个塔座上有一叠圆盘, 这些圆盘自下而上,由大到小地叠在一起。要 求将塔座上的这一叠圆盘移到另一塔座上,并 仍按同样顺序叠置。
• 递归有两个基本要素:
1. 边界条件:确定递归到何时终止; 2. 递归模式:大问题是如何分解为小问题的。
26
Fibonacci数列
• 无穷数列1,1,2,3,5,8,13,21,34, 55,……,称为Fibonacci数列。
• 它可以递归地定义为:
1
n0
F (n)
1
n 1
F (n 1) F (n 2) n 1
递归完成了几乎所有的剩 余工作!
return N * fac(N-1)
24
递归函数设计
• 但是你也必须自己完成一步 def fac(N):
if N <= 1: return 1
else: return fac(N)
这样是无法工作的!
25
递归定义
• 递归(Recursion)就是子程序(或函数) 直接调用自己或通过一系列调用语句间接 调用自己,是一种描述问题和解决问题的 基本方法。
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) Result: 120
23
递归函数设计
挖掘自相似的特性 产生简介、优雅的代码
更少的工作!
def fac(N): if N <= 1:
你需要控制边界条件—— 也就是你能想到的最简单
的情况!
return 1 else:
12
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5)
13
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
函数幕后
fac(5) 5 * fac(4)
14
def fac(N):
函数幕后
fac(5) 5 * fac(4)
4 * fac(3) 3 * fac(2) 2* 1
19
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)Fra bibliotek函数幕后
fac(5) 5 * fac(4)
4 * fac(3) 3* 2
20
def fac(N):
else: return N * fac(N-1)
函数幕后
“栈”
fac(5) 5 * fac(4)
4 * fac(3)
保存了所有对 fac的调用
3 * fac(2) 2 * fac(1)
1
18
def fac(N):
if N <= 1: return 1
else: return N * fac(N-1)
递归与分治
德罗斯特效应
7
德罗斯特效应
8
设计递归函数
• 程序设计中如何设计这样的函数呢?
1 def fac(N):
2
return N * fac(N-1)
这个函数没有边界条件,函数fac的调用将无法终止。
一定要注意首先递归函数要有一个边界条件,之后
再考虑递归的步骤。
9
10
设计递归函数
在印度,有这么一个古老的传说: 在世界中心贝拿勒斯(在印度北部)的 圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候, 在其中一根针上从下到上地穿好了由大 到小的64片金片,这就是所谓的汉诺 塔。不论白天黑夜,总有一个僧侣在按 照下面的法则移动这些金片:一次只移 动一片,不管在哪根针上,小片必须在 大片上面。僧侣们预言,当所有的金片 都从梵天穿好的那根针上移到另外一根 针上时,世界就将在一声霹雳中消灭, 而梵塔、庙宇和众生也都将同归于尽。
递归与分治
31、别人笑我太疯癫,我笑他人看不 穿。(名 言网) 32、我不想听失意者的哭泣,抱怨者 的牢骚 ,这是 羊群中 的瘟疫 ,我不 能被它 传染。 我要尽 量避免 绝望, 辛勤耕 耘,忍 受苦楚 。我一 试再试 ,争取 每天的 成功, 避免以 失败收 常在别 人停滞 不前时 ,我继 续拼搏 。