编程核心思想:以前我java老师曾告诉我们编程思想:初级选手应该从内而外、从小到大,先从实现一个简单的小功能开始,一点一点往里加,最后让功能变复杂(简单->复杂:可以先假定最理想、最简单的数据,在最理想数据的基础上实现之后,再测试修改麻烦的数据模式);而高级选手喜欢从上而下,从难到易,他们倾向于先搭建一个整体的结构框架,再由外而内地一点点地填充起内部简单语句。
--> 当一个函数或算法太复杂时,可以分块完成。比如,统计词频可以分为输入、统计、输出;SimHash算法可能分为扩展、加减权重、收缩等步骤。
--> 编程的精神是开源和共享,网络上有很多可以实现某个功能的代码片段,可以粘贴复制重复利用,而不用自己从头到尾苦心孤诣地一点点写。
工程思维:
- 需要再三再三再三明确具体需求。工程需求是最重要的,一定要仔细反复讨论,容不得半点马虎、模糊或不理解。
- 先形成一个规范、合理、准确的算法。
- 然后,再用编程将其实现。
==>科研和工程的区别:
- 科研注重的是研究,讲求新;而工程注重的是应用,讲求用,方法不必最新,能满足需求应用就行。
- 科研注重的是研究,关注研究的背景和意义;而工程注重的是方法能不能实现工程需求,方法能不能在实际环境中达到可用性。
目录
1. 双层循环思想
2. 迭代思想
3. 递归思想
循环、迭代前提:一定要弄清楚循环条件和循环操作对象。
应用场景:重复反馈过程的活动,不过每一次重复都需要重新遍历原数组。比如:最长回文字符串
应用方法:循环条件为长度判断时->外层while循环,内层for循环;循环条件为中心或索引判断时->外层for循环,内层for循环
应用案例:最大回文字符串;
--> 双层循环与迭代区别:双层循环每一次重复都是对原数组进行操作;迭代是每一次重复的结果会作为下一次迭代的初始值,对更新后的数组进行操作。
# 最大回文字符串-枚举法
def verifyreverse(st):
current = len(st)
trigger = False
while current > 0:
for i in range(len(st) - current + 1):
tmp = st[i:i + current]
# print(tmp)
if tmp == tmp[::-1]:
target = tmp
trigger = True
break
current -= 1
if trigger:
break
return target
print verify reverse("efbaabdi")
迭代(iteration):重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。(A重复调用B)
应用场景:重复反馈过程的活动,不过每一次迭代的结果会作为下一次迭代的初始值,对更新后的数组进行操作。
应用方法:left_index = 0; right = len(string) - 1
应用案例:二分法查找元素和元素索引
--> 迭代和递归区别:迭代是A重复调用B;递归是A重复调用A
递归(recursion):递归常被用来描述以自相似方法重复事物的过程,在数学和计算机科学中,指的是在函数定义中使用函数自身的方法。(A调用A)