算法习题的积累

一、递归

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值