如果图片出不来,请到https://www.bilibili.com/read/cv240257,都是我写的
我们学习新东西之前先来解决下前面的一个问题,就是列表和元组转化为字符串的问题
元组也可以按照上面的方法转化。
但是字符串reversed还没有解决
并且还需要注意,sorted默认返回列表形式。reversed没有默认形式,需要自己设定形式才能显示出来,不设定对象显示的是一个对象。
下面来学习一种新的函数定义,匿名函数的定义。匿名函数顾名思义
可以看到匿名函数:前是形式参数,后面是表达式。和普通函数一样,也有默认参数,关键字参数,收集参数。
匿名函数的好处
下面介绍两个比较厉害的bif
第一个是filter(),筛选函数,我们来看一下文档
看不懂?笔者来举几个例子
可以看到第一个参数是None的时候,它会筛选出值非0的,但是返回需要指定类型,str还是有点问题,最好不要用。下面看一下第一个参数是函数的时候。
可以看到filter过滤器会按照函数的规则去筛选数字,它可以生成元组推导式。还记得以前元组推导式生成的是一个gennerator,后面会讲到
还有一个函数map(),它是一种映射关系
可以看到map是可以有多个参数输入的,但是filter会报错,利用map可以实现加强版zip,可以将对应元素打包成列表不像zip是打包成元组。
下面介绍递归
编程里,递归表现为函数调用自身这么一个行为。
递归必须满足,调用了函数自身并且要有合适的返回条件。否则会有大麻烦
超过了默认的最大递归次数100,当然最大递归次数可以改
改为了1000次
下面举一个简单例子
要知道a(n)就得知道a(n-1),要知道a(n-1就得知道a(n-2))依次类推,最后要知道a(1)=1,然后知道了a(1),就可以知道a(2),知道了a(2),就可以求出a(3),进而一直求到a(n),这就是一个递归过程。
递归很重要,有些问题用递归很好解决
总结一下递归优缺点
你知道如何拍一张递归照片吗,没错只需要一个镜子。可以自己试一试哦。
递归和分形有关联比如谢尔宾斯基三角形
雪花函数
这些分形都是自相似的,虽然分形不一定都是自相似的,了解就好,不扯那么多。
在学习编程时。递归通常和斐波那契数列(也叫兔子数列,就是从兔子的数量来的这么一个数列)和汉诺塔联系起来,我们也不例外。
斐波那契数列1,1,2,3,5,8,13,21,........a1=1,a2=1,a(n)=a(n-1)+a(n-2),n>2
就是这么一个简单的数列,在这里笔者要吹一波自己另一篇文章,最优化方法里一维搜索方法里有一个斐波那契搜索方法和黄金分割方法,写的都还是不错的。
斐波那契数列递推公式有很多求法,可以用用线性代数,这里不扯那么多了。
首先看一下迭代求法
这里用while循环进行迭代,也可以用其他来进行迭代
用列表来也是可以的哦。
再来看一下递归
我们看到递归程序比较容易看懂。但是如果把20改为40的话,笔者试了一下,程序要跑一段时间,
迭代的方法改为100秒出结果
递归反复调用函数是需要花费很长时间的。
下面来解决汉诺塔问题
需要把所有盘子从一个柱子移动到另一个柱子上,规定每次只能移动一个盘子,而且必须大盘子在小盘子下面。
3个盘子很简单,7,8个对你来说也许也不难,那要是64个呢?
所以说我们需要找出一种思路来解这个问题。首先我们把柱子分为a,b,c。只有两个柱子是办不到的,除非只有一个盘子。a是当前柱子,c是目标柱子,b是媒介柱子。我们想,移动过程中有一步一定是这样的,最大的盘子还在a上,其他的盘子在b也就是媒介柱子上(因为小盘子不能在大盘子下面,所以小盘子即使在c上也只是过一下,它是一定会移动的,还会到a或者c上,最后必须是最大的盘子先到c上不动,其他盘子才能在c上不动),然后我们需要从b上移动这n-1个盘子到c,b变为当前柱子,a是媒介柱子,c是目标柱子。问题就可以递归为了移动n-1个盘子到b上,此时b是目标柱子,c是媒介柱子。
按照这种思路
你们可以自己去验证,这个结果是对的。也就是说我们分三步走,第一步,先把n-1个相对小的从a移到b上,再把最大的从a移到c上,最后把n-1个盘子从b移到c上。注意这三步里三个柱子的角色会变化。其实n==1这个判断有很重要的作用,它是一个递归终止条件或者说返回条件,不然我们这个递归怎么结束?里面a,b,c变来变去的,很容易弄晕人,我来举一个例子说明里面的参数变化。
我就以n=2为例了
n=2进去条件不满足进else,先调用h(1,a,c,b),此时注意参数变化,h(2,a,b,c)里的形参a,b,c是从你调用的这个h(2,'a','b','c')传过来的,也就是说,此时n=2,a='a',b='b',c='c'。h(2,a,b,c)里的a传进h(1,a,c,b)对应的形参还是a,但是b传进h(1,a,c,b)对应的形参变为c,c对应的是b,也就是说现在a='a',b='c,c='b'。知道了这个我们来看h(1,a,c,b),n==1条件满足。就会打印a,'->',c这个字符串,也就是'a','->','b'这个字符串。
下面有几个递归例题,请先不要看答案自己思考
答案在这:
0
只要理解十进制转二进制过程,这段代码不难理解。
1
答案当然不止一种
2
不要求用递归其实很简单
3.这个应该没难度
我们学习新东西之前先来解决下前面的一个问题,就是列表和元组转化为字符串的问题
元组也可以按照上面的方法转化。
但是字符串reversed还没有解决
并且还需要注意,sorted默认返回列表形式。reversed没有默认形式,需要自己设定形式才能显示出来,不设定对象显示的是一个对象。
下面来学习一种新的函数定义,匿名函数的定义。匿名函数顾名思义
可以看到匿名函数:前是形式参数,后面是表达式。和普通函数一样,也有默认参数,关键字参数,收集参数。
匿名函数的好处
下面介绍两个比较厉害的bif
第一个是filter(),筛选函数,我们来看一下文档
看不懂?笔者来举几个例子
可以看到第一个参数是None的时候,它会筛选出值非0的,但是返回需要指定类型,str还是有点问题,最好不要用。下面看一下第一个参数是函数的时候。
可以看到filter过滤器会按照函数的规则去筛选数字,它可以生成元组推导式。还记得以前元组推导式生成的是一个gennerator,后面会讲到
还有一个函数map(),它是一种映射关系
可以看到map是可以有多个参数输入的,但是filter会报错,利用map可以实现加强版zip,可以将对应元素打包成列表不像zip是打包成元组。
下面介绍递归
编程里,递归表现为函数调用自身这么一个行为。
递归必须满足,调用了函数自身并且要有合适的返回条件。否则会有大麻烦
超过了默认的最大递归次数100,当然最大递归次数可以改
改为了1000次
下面举一个简单例子
要知道a(n)就得知道a(n-1),要知道a(n-1就得知道a(n-2))依次类推,最后要知道a(1)=1,然后知道了a(1),就可以知道a(2),知道了a(2),就可以求出a(3),进而一直求到a(n),这就是一个递归过程。
递归很重要,有些问题用递归很好解决
总结一下递归优缺点
你知道如何拍一张递归照片吗,没错只需要一个镜子。可以自己试一试哦。
递归和分形有关联比如谢尔宾斯基三角形
雪花函数
这些分形都是自相似的,虽然分形不一定都是自相似的,了解就好,不扯那么多。
在学习编程时。递归通常和斐波那契数列(也叫兔子数列,就是从兔子的数量来的这么一个数列)和汉诺塔联系起来,我们也不例外。
斐波那契数列1,1,2,3,5,8,13,21,........a1=1,a2=1,a(n)=a(n-1)+a(n-2),n>2
就是这么一个简单的数列,在这里笔者要吹一波自己另一篇文章,最优化方法里一维搜索方法里有一个斐波那契搜索方法和黄金分割方法,写的都还是不错的。
斐波那契数列递推公式有很多求法,可以用用线性代数,这里不扯那么多了。
首先看一下迭代求法
这里用while循环进行迭代,也可以用其他来进行迭代
用列表来也是可以的哦。
再来看一下递归
我们看到递归程序比较容易看懂。但是如果把20改为40的话,笔者试了一下,程序要跑一段时间,
迭代的方法改为100秒出结果
递归反复调用函数是需要花费很长时间的。
下面来解决汉诺塔问题
需要把所有盘子从一个柱子移动到另一个柱子上,规定每次只能移动一个盘子,而且必须大盘子在小盘子下面。
3个盘子很简单,7,8个对你来说也许也不难,那要是64个呢?
所以说我们需要找出一种思路来解这个问题。首先我们把柱子分为a,b,c。只有两个柱子是办不到的,除非只有一个盘子。a是当前柱子,c是目标柱子,b是媒介柱子。我们想,移动过程中有一步一定是这样的,最大的盘子还在a上,其他的盘子在b也就是媒介柱子上(因为小盘子不能在大盘子下面,所以小盘子即使在c上也只是过一下,它是一定会移动的,还会到a或者c上,最后必须是最大的盘子先到c上不动,其他盘子才能在c上不动),然后我们需要从b上移动这n-1个盘子到c,b变为当前柱子,a是媒介柱子,c是目标柱子。问题就可以递归为了移动n-1个盘子到b上,此时b是目标柱子,c是媒介柱子。
按照这种思路
你们可以自己去验证,这个结果是对的。也就是说我们分三步走,第一步,先把n-1个相对小的从a移到b上,再把最大的从a移到c上,最后把n-1个盘子从b移到c上。注意这三步里三个柱子的角色会变化。其实n==1这个判断有很重要的作用,它是一个递归终止条件或者说返回条件,不然我们这个递归怎么结束?里面a,b,c变来变去的,很容易弄晕人,我来举一个例子说明里面的参数变化。
我就以n=2为例了
n=2进去条件不满足进else,先调用h(1,a,c,b),此时注意参数变化,h(2,a,b,c)里的形参a,b,c是从你调用的这个h(2,'a','b','c')传过来的,也就是说,此时n=2,a='a',b='b',c='c'。h(2,a,b,c)里的a传进h(1,a,c,b)对应的形参还是a,但是b传进h(1,a,c,b)对应的形参变为c,c对应的是b,也就是说现在a='a',b='c,c='b'。知道了这个我们来看h(1,a,c,b),n==1条件满足。就会打印a,'->',c这个字符串,也就是'a','->','b'这个字符串。
下面有几个递归例题,请先不要看答案自己思考
请先自己思考,灵梦还留不住你吗?那再来一张
答案在这:
0
只要理解十进制转二进制过程,这段代码不难理解。
1
答案当然不止一种
2
不要求用递归其实很简单
3.这个应该没难度