600x笔记(week-3 递归与对象)

来源:互联网 发布:网络表情用英文怎么说 编辑:程序博客网 时间:2024/05/29 19:03

在上一节讲完迭代之后,这节就介绍递归了。至于递归的话,个人感觉廖老师的这一章讲得比较好。
个人理解使用递归最主要实现两个方面,一是实现基础条件,而是实现用一个含参数向基础条件趋势发展的原函数来表达初始原函数。说得好点绕,其实简单来讲,就是要求出类如n=1对应的返回数值,而且要实现用n-1来表达n,就可以使用递归了。
我觉得说多无益来个典型的汉诺塔最实际:

def move(n,a,b,c):    if n==1:        print(a,'-->',c)    else:        move(n-1,a,c,b)        move(1,a,b,c)        move(n-1,b,a,c)move(10000,'A','B','C')

复制一下当时初学的思路:一开始着手去做题的时候,也许是思维习惯, 相对于递归, 我们更习惯一步接一步地去做。所以在一开始,我就试图在列出来的路径里面找到一些规律,然而写到第4个盘子的时候,我知道不太可能。之后理解了,才明白类似知道f(n)=f(n-1)+f(n-2),f(1)=1这些条件,求f(100),从小就被灌输这如果一个一个放进去算求答案(比方说要求f(100),得知道f(99),f(98)。。f(2),f(1)),几乎是不可能也不实际的,所以我的思维就自然不会往这方面去想,然而恰恰问题是现在的计算机有着强悍的计算能力。既然计算机的计算能力这么强,那么就可以放手去做了。首先,我得设一个函数,然后得知道如何用n-1来表示n,最后假如还知道初始值,那剩下的毫无意外就是电脑的工作了。作业上老师也提示了,函数move(n,a,b,c)代表,打印出来的就是n块盘子由A柱子移到B柱子的所有路线。(重点字眼:n块,A到C,所有路线)。然后接下来的工作是如何用n-1去表示n。首先我们得理解如何将盘子由A柱子移到C柱子,先把问题变简单,例如只有两块盘子的话,我们就得先把A柱子上面的那块移到B柱子,这时A柱子只剩下面最后一块,再把A柱子的那块移到C柱子那里去,最后再把B柱子那块移到C柱子上,一共三个步骤。(总之目的就是要A柱子那最大那块盘子能顺顺利利地去到C柱子的最底部,这是移动盘子的根本嘛)理解了两块的移动模式,就能理解有n块盘子的时候,问题能简化成将A柱子上的n-1块盘子移到B柱子上,然后再将A柱子上只剩的一块盘子移到C柱子,再将B柱子上那n-1块的盘子移到C柱子上。也就是说假如我能把上述情况用函数表示出来,还把n=1时结果写出来,剩下的就是电脑自己算的事咯。这时候再看看老师给的函数move(n,a,b,c)代表,打印出来的就是n块盘子由A柱子移到B柱子的所有路线。也就是说将A柱子上的n-1块盘子移到B柱子上所有的路线,可以用函数表达成move(n-1,a,c,b)。然后再将A柱子上只剩的一块盘子移到C柱子,可以用函数表达成move(1,a,b,c)。再将B柱子上那n-1块的盘子移到C柱子上。可以用函数表达成move(n-1,b,a,c)。而n=1时,print(a,’–>’,c)。至此,我能用n-1表示出n,又知道初始值。再编一下程,大功告成!!


最后介绍复合数据类型list,tuple,dict,然而没有介绍set。这里要值得注意的是tuple,dict的不变属性,其中tuple可以含list,而dict中的key就不行了。
另外在使用list等可变对象进行赋值的时候一定要小心,eg:

a = [0,1]b = aa = a.append(2)print(b)

以上b输出是[0,1,2],然而对a进行加法运算时:

a = [0,1]b = aa = a + bprint(b)

b的输出为[0,1],所以在进行list备份时应使用以下方法:

a = [0,1]b = a[:] #进行克隆a = a.append(2)print(b)
原创粉丝点击