第三講 簡單算法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裏面的函數。省去了模塊名