第三讲 简单算法python
循环(迭代)算法
while循环:ide
例:函数
while循环须要一个布尔测试来判断是否来执行循环体,若是布尔测试结果为真(itersLeft不等于0)则执行循环体,当到达指令序列的结尾时(循环体结束时),它会返回从新测试布尔值以上图为例,所以,它会在代码中循环几回,直到布尔值最终为假。当布尔值为假时, 程序会跳到循环的结尾处,就是缩进中止的地方,而后程序继续选择新的指令并继续执行。测试
while循环须要在循环体中改变布尔测试的变量,若是不改变循环永远都不会结束调试
循环的特征:code
须要一个变量:orm
在循环体外初始化排序
在循环体内改变ci
测试的结束取决于这个变量
Guess and Check:
猜想检验方法, 经过迭代的方法,给出处理中的问题的不一样结果,而后检验结果是否正确。
穷举:
简单地从可能值域的一端的开始,而且试图按顺序尝试每一个值。
例:
经过猜想检验的方法求出某个整数的立方根
# lecture 3.2, slide 6 # Find the cube root of a perfect cube x = int(raw_input('Enter an integer: ')) ans = 0 while ans**3 < abs(x): ans = ans + 1 if ans**3 != abs(x): print(str(x) + ' is not a perfect cube') else: if x < 0: ans = -ans print('Cube root of ' + str(x) + ' is ' + str(ans))
for循环:
从一系列选择中完成迭代
语法:
for <identifier> in <sequence>: <code block>
循环开始时,标识符最初会绑定到序列里的第一个值。接着运行代码块。运行结束后,标识符将会绑定到序列里的下一个值,运行代码块。直到序列里的全部值都被运行。
range(n):产生一个从0到n-1的序列
range(m,n):产生一个从m到n-1的序列
break:跳出当前循环
例:
经过for循环遍历0到x之间的整数来查找x的立方根,若是找到了经过break跳出循环
# lecture 3.3, slide 3 # Find the cube root of a perfect cube x = int(raw_input('Enter an integer: ')) for ans in range(0, abs(x)+1): if ans**3 == abs(x): break if ans**3 != abs(x): print(str(x) + ' is not a perfect cube') else: if x < 0: ans = -ans print('Cube root of ' + str(x) + ' is ' + str(ans))
浮点数
浮点数是一个近似值,要测试两个浮点数是否相同应该采用两个浮点数差得绝对值小于某一个数。
二分查找法:
对于拥有排序属性的问题,二分查找能有效的下降解决问题的步骤。
二分查找法是先找到中间的数据与须要的结果作对比,经过比较大小,就能够肯定哪一半是不须要的,这是再在另外一半数据中按二分法查找,这样每次只须要查找不多的数据就能获得须要的结果。
例:
# lecture 3.6, slide 2 # bisection search for square root x = 12345 epsilon = 0.01 numGuesses = 0 low = 0.0 high = x ans = (high + low)/2.0 while abs(ans**2 - x) >= epsilon: print('low = ' + str(low) + ' high = ' + str(high) + ' ans = ' + str(ans)) numGuesses += 1 if ans**2 < x: low = ans else: high = ans ans = (high + low)/2.0 print('numGuesses = ' + str(numGuesses)) print(str(ans) + ' is close to square root of ' + str(x))
牛顿拉夫逊算法:
该算法用于查找多项式的根,多项式 p(x)是一个具备系数和指数的序列,即anxn+an-1xn-1+....+a1x1+a0它只是一个序列,若是g是根的近似值,即结果为0,那么g-p(g) / p’(g)是
一个更加接近的数值,其中p’是p的导数
# Lecture 3.7, slide 3 # Newton-Raphson for square root epsilon = 0.01 y = 24.0 guess = y/2.0 while abs(guess*guess - y) >= epsilon: guess = guess - (((guess**2) - y)/(2*guess)) print(guess) print('Square root of ' + str(y) + ' is about ' + str(guess))
第四讲 函数
函数
将计算的细节和计算的使用区分开来,咱们将此称做黑盒抽象。这使得重复使用更加方便,调试和修改也更加简单。函数能够在不一样的地方重复使用
语法:
def <function name> (<formal parameters>): <function body>
def是一个关键字
例:
def max(x, y): if x > y: return x else: return y
函数经过以下方式调用:
z = max(3, 4)
retrun是一个关键字,用于在函数内返回紧跟其后的表达式的值
当前环境下的变量只做用于当前环境,调用函数时,函数会开辟单独的环境,外部变量的值,经过函数的参数与函数内部的变量绑定。
模块:
模块经过import或form * import *导入
将拥有共同主题的函数放在一个单独的python文件中,这样在其余文件中就可使用import导入这些函数。
例:
这是circle.py的文件
# circle.py # From Lecture 4, Modules pi = 3.14159 def area(radius): return pi*(radius**2) def circumference(radius): return 2*pi*radius
下面经过import导入这个模块
import circle pi = 3.0 print pi print(circle.pi) print(circle.area(3)) print(circle.circumference(3))
这样就能经过 模块名.函数名 调用circle.py里面的函数,变量
下面是经过from * import *来导入,这样是将circle中全部的内容都导入
from circle import * pi = 0.0 print(pi) print(area(3)) print(circumference(3))
这样的调用能够经过函数名直接使用circle里面的函数。省去了模块名