2019.2.11MIT的python课笔记第二 第五堂课

2019.2.11MIT的python课笔记第二 第五堂课


p30 p31 p32 p33 p34 p35
B站上课链接
https://www.bilibili.com/video/av10447870/?p=30

综述课前言

  1. 讨论写过的函数,把他们看作迭代计算的核心。
  2. 并且会谈到卓越的概念——递归(recursion)将问题更简单快速地开展
  3. 我们会谈论递归(recursion)是怎样建立在归纳(induction)的基础上的——从而揭示为什么递归算法这么管用
  4. 设计出递归算法的通用原理,展示经典有趣的递归算法,特别是分治法(divide and conquer methods)

相关问题

  1. 我怎么知道我们的递归代码会正常运行呢?

概念

  1. 斐波那契数列的原先想法

  2. 回文结构(palindrome does)
    基本概念是从字符的两端开始检查,如果相同就再缩短两端,

  3. 迭代算法,由迭代结构组成。很自然地就引出了我们的迭代算法

  • 迭代算法把“计算”捕捉下来变成“状态变量”

  • 递归算法:刚才完成的递加求乘法的简化表示
    在这里插入图片描述

  1. 递归(recursion)
    这是递归算法的简单例子
  • 将问题化简到了一个更简单版本的问题,加上了一些简单的计算(简化步骤recursive step)
  • 怎样简化到能够直接解决(基线条件base case)

例如:

  • a*b=a;if b=1 (Base case)
  • ab=a+a(b-1);otherwise (Recursive case)
  1. 以递归的形式求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) 
		 #自己调用自己!
  1. 怎么用数学归纳法说明程序结构呢?
    上面的程序 b=1时返回了正确的结果,假定在规模是b-1的时候也有正确的结果,我们试着计算一下规模是b的结果,当然在return的时候 recurMul(a,b-1)是正确计算的,然后仅仅加了a,所以还是正确的计算,所以归纳法证完毕。

总结

  1. 给出一个问题,利用递归算法,我能够把它简化成更简单的版本,一直分解计算直到达到基线条件
  2. 递归算法把计算捕捉,变成了状态变量,虽然难以理解但是非常有效的算法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值