典型遞迴演算法例子 Python實現

2021-06-09 19:57:21 字數 3083 閱讀 3468

#!/usr/bin/python

#coding=utf-8

'''created on 2012-9-25

@author: linzuxin

'''status = {}

def factorial(n):

'''輸入乙個數字,求其階乘。status是乙個hash,用來儲存中間結果,避免重複計算

@param n: 要求的數字

@return: n的階乘

'''if n == 0 or n == 1:

status[0] = 1

status[1] = 1

return 1

elif status.has_key(n):

return status[n]

else:

status[n] = factorial(n - 1) * n

return status[n]

print factorial(100)

#!/usr/bin/python

#coding=utf-8

'''created on 2012-9-25

@author: linzuxin

'''status = {}

def fibonacci(n):

'''輸入乙個數字,求其斐波那契數。status是乙個hash,用來儲存中間結果,避免重複計算

@param n: 要求的數字

@return: n的斐波那契數

'''if n == 0 or n == 1:

status[0] = 1

status[1] = 1

return 1

elif status.has_key(n):

return status[n]

else:

status[n] = fibonacci(n - 2) + fibonacci(n - 1)

return status[n]

print fibonacci(100)

#!/usr/bin/python

#coding=utf-8

'''created on 2012-9-26

@author: linzuxin

'''def permutation(array, start, end):

'''輸入乙個陣列,然後輸出其全排列

@param array: 要求全排列的陣列

@param start: 陣列的開始下標

@param end: 陣列的結束下標

'''if start == end:

for i in array:

print i,

print

else:

for i in range(start, end + 1):

array[start], array[i] = array[i], array[start]

permutation(array, start + 1, end)

array[start], array[i] = array[i], array[start]

array = [1, 2, 3]

permutation(array, 0, len(array) - 1)

#!/usr/bin/python

#coding=utf-8

'''created on 2012-9-26

@author: linzuxin

'''status = {}

def divideint(n, m):

'''輸入乙個數字,求其整數劃分種類

@param n: 要求的數字

@param m: 劃分中最大的加數不大於m

@return: 劃分總數

'''try:

return status[(n, m)]

except keyerror:

if n == 1 or m == 1:

status[(n, m)] = 1

return status[(n, m)]

elif m > n:

status[(n, m)] = divideint(n, n)

return status[(n, m)]

elif m == n:

status[(n, m)] = 1 + divideint(n, n - 1)

return status[(n, m)]

else:

status[(n, m)] = divideint(n - m, m) + divideint(n, m - 1)

return status[(n, m)]

print divideint(500, 500)

#!/usr/bin/python

#coding=utf-8

'''created on 2012-9-26

@author: linzuxin

'''count = 0

def hanoi(n, start, end, middle):

'''輸入漢諾塔個數,求出其需要移動的次數

@param start: 開始漢諾塔的位置

@param end: 最終漢諾塔的位置

@param middle: 用來過渡的位置

'''global count

if n == 1:

print start, ' => ', end

count += 1

else:

hanoi(n - 1, start, middle, end)

print start, ' => ', end

count += 1

hanoi(n - 1, middle, end, start)

hanoi(2, 'a', 'b', 'c')

print count

Dinic演算法例子

寫法 1 用鄰接矩陣儲存各個流的起點終點 2 用bfs把圖分出層次 記錄到各個點需要流幾次 3 用dfs對圖找出增廣路進行流量擴充 注意反向流要記錄成容量為0的路徑,更新正向流時也要更新反向流 教材361頁 includeusing namespace std struct edge edge ed...

分治演算法 例子

分治策略 將問題分解成若干個小的子問題,每個子問題與大問題同型 所以裡面可以用遞迴 但規模更小 遞迴解決這些子問題 將子問題的解答合併,獲得大問題的解答 最大欄位和問題 include include include using namespace std int a 100 int maxsum ...

排序演算法例子

氣泡排序 include using namespace std 氣泡排序,時間複雜度o n 2 穩定,比較次數最少n 1,最多n n 1 2 void bubble sort int list,int num int main bubble sort2 arraylist,len for int ...