1. 程式人生 > >經典演算法題目(一)

經典演算法題目(一)

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))