一、递归
1 阶乘函数
def factorial(n):
if n == 1:
return n
return n * factorial(n - 1)
print(factorial(5)) # 120
2 Fibonacci数列
# 1 1 2 3 5 8 13
def Fibonacci(n):
if n == 1 or n == 2:
return 1
return Fibonacci(n - 1) + Fibonacci(n - 2)
print(Fibonacci(6)) # 8
3 全排列问题
def perm(arr, m, n):
if m == n:
for i in arr:
print(str(i) + ' ', end='')
print()
for i in range(m, n):
swap(arr, m, i)
perm(arr, m + 1, n)
swap(arr, m, i) # 还原,以避免重复
def swap(arr, a, b):
temp = arr[a]
arr[a] = arr[b]
arr[b] = temp
perm([1, 2, 3], 0, 3)
# 1 2 3
# 1 3 2
# 2 1 3
# 2 3 1
# 3 2 1
# 3 1 2
二、动态规划
1 求最长公共子序列
def LCS(str1, str2):
l1 = len(str1)
l2 = len(str2)
substr = []
# for _ in range(10):表示不用设置变量,用_指代临时变量
dp = [[0] * (l1 + 1) for _ in range(l2 + 1)]
for i in range(1, l2 + 1):
for j in range(1, l1 + 1):
if str1[j - 1] == str2[i - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
substr.append(str1[j - 1])
else:
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
print('Length:{0}'.format(dp[l2][l1]))
print('Longest Common String:' + ''.join(substr))
s1 = 'abcde'
s2 = 'ace'
LCS(s1, s2)
# Length:3
# Longest Common String:ace