一、《计算机科学概论》
第七章、问题求解与算法设计
(一)如何解决问题
- 步骤
第一步:理解问题
第二步:找到信息和解决方案之间的联系,如果找不到直接联系,则可能需要考虑设计辅助问题。最终应该找到解决方案。
第三步:正确地执行方案
第四步:分析的得到的解决方案
George Polya——《How to solve it》
- 寻找熟悉的情况
永远不要彻底重新做一件事,学会借鉴改进已有的解决方案,举一反三。
- 分治法:把大问题分割成能独立解决的小问题,“子任务”
- 算法(algorithm)在有限的时间内用有限的数据解决问题的明确指令集合。
- 计算问题求解过程:四个阶段:分析和说明阶段、算法开发阶段、实现阶段、维护阶段
(二)有简单参数的算法
- 带有选择的算法:if elif else
- 带有循环的算法:
(1) 计数控制循环:设置循环控制变量,while+expression,控制变量增量
(2) 事件控制循环:不同于计数控制循环,用计数器控制循环的始末。此方法是用while+expression,的布尔值来控制循环的。
(3) 嵌套结构(nested structure):控制结构嵌入另一个控制结构,又称为嵌套逻辑。
(4) 抽象步骤(abstract step)细节仍未明确的算法步骤
具体步骤(concrete step)细节完全明确的算法步骤
(三)复杂变量
1.数组:同构项目的有名集合,与数组有关的三种算法:搜索、排序、处理
(1)搜索算法:
i) 顺序搜索,
ii)有序数组中的顺序搜索,
iii)二分检索(采用分治法,检索有序数组)(binary search):在有序列表中查找项目的操作,通过比较操作排除大部分的检索范围。
(2)排序
i)选择排序
ii)冒泡排序
iii)插入排序
2.记录:异构项目的有名集合,
(四)递归算法
1.递归(recursion)算法调用它本身的能力,是另一种重复循环的控制结构。
2.子程序 调用单元 return
3.无限递归与无限循环等价
4.递归阶乘的python实现
#递归阶乘
def jiecheng(a):
if a==1:
return a
elif a == 0:
return 1
else:
return a*jiecheng(a-1)
n = int(input(‘digit please‘))
print(jiecheng(n))
5.递归二分检索
6.快速排序
(五)几个重要思想
1.信息隐蔽(information hiding):隐蔽模块的细节以控制对这些细节的访问的做法
2.抽象:(abstraction)复杂系统的一种模型,只包括对观察者来说必须的细节
(1)数据抽象(data abstraction)把数据的逻辑视图和它的实现分离开
(2)过程抽象(procedural abstraction)把动作的逻辑视图和它的实现分离开
(3)控制抽象(control abstraction)把控制结构的逻辑视图和它的实现分离开
(4)控制结构(control structure)用改变正常的顺序控制流的语句
备注:重要算法
穷举法,穷举思想。
循环算法
二、《自学是一门手艺》
第十章、为什么从函数开始
在绝大多数情况下,输入多于输出,或者说,输入远大于输出,这不仅是自然现象,也是无法改变的规则
在未来的学习中,有空就去读读别人写的代码是一个需要养成的好习惯,理解能力的提高就靠他了,就像学习英语一样,读得多了,自然就读的快了,也就理解的快了,在过程中还能自然而然的习得更多的句式。说理方法、讲故事的策略,最终变得“很能写”
结构化编程的核心就是拆分任务。在什么情况下任务就不能再拆分了呢?当一个函数只完成一项功能的时候。
第十一章第一二节、关于参数
- 命名:不能有空格、不能用数字开头、学会使用下划线
- 如果没有返回值,函数默认返回布尔值,从而可以用于条件语句
- 闰年判断,python
year = int(input(‘请输入要判断的年份‘))
if year%4==0:
if year%400==0:
print(‘是闰年‘)
elif year%100==0 and year%400!=0:
print(‘不是闰年‘)
else:
print(‘是闰年‘)
elif year%4!=0:
print(‘不是闰年‘)
- 斐波那契数列 python
n=int(input(‘你需要第几项斐波那契数列值:‘))
n1=1
n2=1
count=2
if n<=0:
print(‘输入数字有误‘)
elif n==1 or n==2:
print(1)
else:
while count<n:
nn=n1+n2
n1=n2
n2=nn
count+=1
print(nn)
- 局部变量与全局变量
函数每次被调用的时候都会开辟一个区域,所以即使局部变量与全局变量名称相同,他们也不是同一个变量。
一个比较好的习惯:如果传递进来的之值是列表,那么在函数内部对其进行操作之前,创建他的一个拷贝。
- 可接受一系列值的位置参数
带一个* (arbitrary positional arguments)
在函数内部,把可变位置参数当做一个容器来处理。
一个函数只可定义一个可变位置参数,且写于其他参数后面。
def say_hi(*names):
for name in names:
print(f‘Hi,{name}!‘)
names=(‘jack‘,‘linda‘,‘tom‘,‘bob‘)
say_hi(*names)
Hi,jack!
Hi,Linda!
Hi,tom!
Hi,bob!
- 关键字参数(keyword arguments)从用户角度看,这些设定了默认值的参数就变成了可选参数。同样,我们可以设定一个能够接收很多个值的关键字参数。** (arbitrary keyword arguments)
- Python参数排序规则
Positional — arbitrary positional— keyword — arbitrary keyword
第三节、化名与匿名
- 化名:很容易导致重名、取名含混。不是个好主意。
- 用lambda关键字写一个很短的函数
(1) lambda x,y:x+y
(2) 冒号之后有且仅有一个表达式
(3) 这个函数没有名字,因而称为匿名函数。
(4) Add = lambda x,y:x+y 将匿名函数命名。
- Lambda 函数的使用场景
(1) 作为另一个函数的返回值
(2) 作为另一个函数的参数
第四节、递归函数
1.即那些在自身内部调用自身的函数
2.递归阶乘 python
#递归阶乘
def jiecheng(a):
if a==1:
return a
elif a == 0:
return 1
else:
return a*jiecheng(a-1)
n = int(input(‘digit please‘))
print(jiecheng(n))
3.规律:return 返回自身的调用 、return至少有一个返回终止条件、在递归过程中能逐步达到退出条件。
原文地址:https://www.cnblogs.com/cfqlovem-521/p/11831142.html