數據結構和算法-遞歸

去的過程叫, 回的過程叫, 解決遞歸問題最重要的兩步是python

  • 寫遞推公式
  • 找到終止條件

遞歸須要知足如下3個條件算法

  • 一個問題能夠分解爲多個子問題(數據規模更小的問題)
  • 主問題和分解後的子問題求解思路相同 - 基線條件
  • 存在遞歸終止條件

使用遞歸計算列表和

def add(nums):
    if len(nums) == 1:    # 終止條件
        return nums[0]
    return nums[0] + add(nums[1:])    # 遞推公式


res = add(range(4))
print(res)

計算臺階問題

  • 終止條件
    f(1) = 1
    f(2) = 2
  • 遞推公式
    f(n) = f(n-1) + f(n-2)緩存

    # coding:utf-8
    
    """
    臺階問題
    
    一共有7個臺階, 每一次只能走1個或2個, 有幾種走法
    
    能夠分爲2類, 第一次走1個和第一次走2個
    f(n) = f(n-1) + f(n-2)
    
    終止條件是
    f(1) = 1, f(2) = 2
    """
    
    cache = {}  # 加上運算值的緩存, 避免出現重複計算
    
    def f_0(n):
        if n == 1:
            return 1
        if n == 2:
            return 2
        if n in cache:
            return cache[n]
        else:
            cache[n] = f_0(n - 1) + f_0(n - 2)
            return cache[n]

    改成非遞歸方式數據結構

    def f_1(n):
        """改成非遞歸形式"""
        if n == 1:
            return 1
        if n == 2:
            return 2
        x, y = 1, 2
        for _ in range(3, n + 1):
            x, y = y, x + y
        return y

注意

  • 遞歸調用可能致使堆棧溢出
  • 避免出現重複計算

資料

  • 數據結構和算法之美-王爭
  • < <大話數據結構> >-程傑
  • < <漫畫算法> >
  • < <數據結構和算法> >

相關文章
相關標籤/搜索