p30 p31 p32 p33 p34 p35
B站上课链接
https://www.bilibili.com/video/av10447870/?p=30
综述课前言
- 讨论写过的函数,把他们看作迭代计算的核心。
- 并且会谈到卓越的概念——递归(recursion)将问题更简单快速地开展
- 我们会谈论递归(recursion)是怎样建立在归纳(induction)的基础上的——从而揭示为什么递归算法这么管用
- 设计出递归算法的通用原理,展示经典有趣的递归算法,特别是分治法(divide and conquer methods)
相关问题
- 我怎么知道我们的递归代码会正常运行呢?
概念
-
斐波那契数列的原先想法
-
回文结构(palindrome does)
基本概念是从字符的两端开始检查,如果相同就再缩短两端, -
迭代算法,由迭代结构组成。很自然地就引出了我们的迭代算法
-
迭代算法把“计算”捕捉下来变成“状态变量”
-
递归算法:刚才完成的递加求乘法的简化表示
- 递归(recursion)
这是递归算法的简单例子
- 将问题化简到了一个更简单版本的问题,加上了一些简单的计算(简化步骤recursive step)
- 怎样简化到能够直接解决(基线条件base case)
例如:
- a*b=a;if b=1 (Base case)
- ab=a+a(b-1);otherwise (Recursive case)
- 以递归的形式求recurMul(2,3)
可以观察到一直解开到基线条件然后往回返回
- 递归的形式每次使用函数都会创造变量的局部作用域,在该环境中,对函数主体进行求值的需要非常清晰。明确使用的值
- 局部作用域名当中的变量绑定都是独特的。我们没办法改变局部域当中的绑定,都自动进行了没有权限进入局部域
- 控制流能很自然地传递回一个更早的框架,只要函数调用返回了它的数值
- 如果运用恰当,本质上一个函数的递归调用就会化简为一个状态变量·
应用
- 用简单的连续相加,定义乘法
状态变量就只有:
i——重复次数,从b开始
result——当前结果,从0开始 - 更新规则:
i←i-1;当0的时候停止
result←result+a
状态变量的特性,如果计算停在某一点可以告诉我当前的值是多少,并且还可以告诉我什么时候终止循环。
用状态变量表示之后,我们就可以把加法仅仅看成状态变量的更新过程
def iterMul(a,b):
result=a
while b>0:
result +=a
b-= 1
return result
#把这一状态变量的思想代码化之后可以看到非常棒
2.用递归算法定义乘法
def recurMul(a,b):
if b==1:
return a
else:
return a+recurMul(a,b-1)
#自己调用自己!
- 怎么用数学归纳法说明程序结构呢?
上面的程序 b=1时返回了正确的结果,假定在规模是b-1的时候也有正确的结果,我们试着计算一下规模是b的结果,当然在return的时候 recurMul(a,b-1)是正确计算的,然后仅仅加了a,所以还是正确的计算,所以归纳法证完毕。
总结
- 给出一个问题,利用递归算法,我能够把它简化成更简单的版本,一直分解计算直到达到基线条件
- 递归算法把计算捕捉,变成了状态变量,虽然难以理解但是非常有效的算法