經典演算法題目(一)
阿新 • • 發佈:2018-12-11
1. 用遞迴演算法求解一個數組的最大最小值
輸入 L = [5, 8, 4, 3, 1, -9]
輸出 (8,-9)
def max_min(L): end = len(L) -1 if end <= 1: return (L[0],L[1]) if L[0]>L[1] else (L[1],L[0]) else: end = end // 2 # t1 t2返回的是元組,大的數在前,小的數在後 t1 = max_min(L[:end]) t2 = max_min(L[end:]) return (t1[0] if t1[0] > t2[0] else t2[0], t1[1] if t1[1] < t2[1] else t2[1]) print(max_min([1,2,3,4,5])) print(max_min([10,10,20,4,5]))
2. 求斐波那契數列
'''計算斐波那契數 1. 遞迴的優化方法之一:利用迴圈 2. python中遞迴不超過1000 ''' def fob(n): '''方法一:利用遞迴''' if n == 0 or n == 1: return 1 else: return fob(n-1) + fob(n-2) for i in range(10): print(fob(i)) def fob2(n): '''相比方法一,節約了空間(棧的開闢需要空間),同時節約了時間(避免了重複計算)''' #index記錄迴圈執行的下標,同時為斐波那契數列的前兩個數賦初值 index, f, b = 0,1,1 while index <= n-2: f, b = b, f+b index += 1 return b for i in range(10): print(fob2(i)) def fob3(n): '''使用協程(yield)來重新實現fob2''' index, f, b = 0,0,1 while index < n: yield b # 保留當前執行的上下文(變數和下一條要執行的語句),進入阻塞等待的狀態 f, b = b, f+b index += 1 if __name__ == "__main__": f = fob3(8) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f))