Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cs61a番外:关于递归及其优化的问题 #10

Open
AaronChen5651 opened this issue Feb 6, 2025 · 0 comments
Open

cs61a番外:关于递归及其优化的问题 #10

AaronChen5651 opened this issue Feb 6, 2025 · 0 comments
Labels
lecture note 课程笔记

Comments

@AaronChen5651
Copy link
Owner

AaronChen5651 commented Feb 6, 2025

1.递归的一种优化方法:缓存优化(减少重复计算),以斐波那契数列为例

计算斐波那契数列
Python 代码:

def fibonacci(n):
    if n == 0:  # 终止条件
        return 0
    if n == 1:  # 终止条件
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)  # 递归调用

递归过程示意

fibonacci(5)
= fibonacci(4) + fibonacci(3)
= (fibonacci(3) + fibonacci(2)) + (fibonacci(2) + fibonacci(1))
= ((fibonacci(2) + fibonacci(1)) + fibonacci(2)) + (fibonacci(2) + 1)
= (((fibonacci(1) + fibonacci(0)) + fibonacci(1)) + fibonacci(2)) + (fibonacci(2) + 1)
= (((1 + 0) + 1) + fibonacci(2)) + (fibonacci(2) + 1)
= (((1 + 0) + 1) + ((1 + 0) + 1)) + (((1 + 0) + 1) + 1)
= 5

缺点:重复计算! 可以用 缓存优化
缓存优化(减少重复计算)
斐波那契数列 的递归会重复计算很多次,可以使用 缓存 来优化:

from functools import lru_cache

@lru_cache(None)  # 自动缓存计算结果
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(50))  # 只需几毫秒!

优化效果:

  • 时间复杂度 从 O(2ⁿ) 降到 O(n)
  • 计算 fibonacci(50) 快100万倍
@AaronChen5651 AaronChen5651 added the lecture note 课程笔记 label Feb 10, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
lecture note 课程笔记
Projects
None yet
Development

No branches or pull requests

1 participant