第三讲 简单算法
循环(迭代)
while循环:
例:
while循环需要一个布尔测试来判断是否来执行循环体,如果布尔测试结果为真(itersLeft不等于0)则执行循环体,当到达指令序列的结尾时(循环体结束时),它会返回重新测试布尔值以上图为例,因此,它会在代码中循环几次,直到布尔值最终为假。当布尔值为假时, 程序会跳到循环的结尾处,就是缩进停止的地方,然后程序继续选择新的指令并继续执行。
while循环需要在循环体中改变布尔测试的变量,如果不改变循环永远都不会结束
循环的特征:
需要一个变量:
在循环体外初始化
在循环体内改变
测试的结束取决于这个变量
Guess and Check:
猜测检验方法, 通过迭代的方法,给出处理中的问题的不同结果,然后检验结果是否正确。
穷举:
简单地从可能值域的一端的开始,并且试图按顺序尝试每个值。
例:
通过猜测检验的方法求出某个整数的立方根
# lecture 3.2, slide 6# Find the cube root of a perfect cubex = int(raw_input('Enter an integer: '))ans = 0while ans**3 < abs(x): ans = ans + 1if 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循环:
从一系列选择中完成迭代
语法:
forin :
循环开始时,标识符最初会绑定到序列里的第一个值。接着运行代码块。运行结束后,标识符将会绑定到序列里的下一个值,运行代码块。直到序列里的所有值都被运行。
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 cubex = int(raw_input('Enter an integer: '))for ans in range(0, abs(x)+1): if ans**3 == abs(x): breakif 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 rootx = 12345epsilon = 0.01numGuesses = 0low = 0.0high = xans = (high + low)/2.0while 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.0print('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 rootepsilon = 0.01y = 24.0guess = y/2.0while 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( ):
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, Modulespi = 3.14159def area(radius): return pi*(radius**2)def circumference(radius): return 2*pi*radius
下面通过import导入这个模块
import circlepi = 3.0print piprint(circle.pi)print(circle.area(3))print(circle.circumference(3))
这样就能通过 模块名.函数名 调用circle.py里面的函数,变量
下面是通过from * import *来导入,这样是将circle中所有的内容都导入
from circle import *pi = 0.0print(pi)print(area(3))print(circumference(3))
这样的调用可以通过函数名直接使用circle里面的函数。省去了模块名