032 代碼複用與函數遞歸

1、概述

  • 代碼複用與模塊化設計
  • 函數遞歸的理解
  • 函數遞歸的調用過程
  • 函數遞歸實例解析

2、代碼複用與模塊化設計

2.1 代碼複用

把代碼當成資源進行抽象編程

  • 代碼資源化:程序代碼是一種用來表達計算的"資源"
  • 代碼抽象化:使用函數等方法對代碼賦予更高級別的定義
  • 代碼複用:同一份代碼在須要時能夠被重複使用

函數 和 對象 是代碼複用的兩種主要形式模塊化

函數:將代碼命名函數

在代碼層面創建了初步抽象spa

對象:屬性和方法設計

<a>.<b><a>.<b>()code

在函數之上再次組織進行抽象orm

2.2 模塊化設計

分而治之對象

  • 經過函數或對象封裝將程序劃分爲模塊及模塊間的表達
  • 具體包括:主程序、子程序和子程序間關係
  • 分而治之:一種分而治之、分層抽象、體系化的設計思想

緊耦合 鬆耦合blog

  • 緊耦合:兩個部分之間交流不少,沒法獨立存在
  • 鬆耦合:兩個部分之間交流較少,能夠獨立存在
  • 模塊內部緊耦合、模塊之間鬆耦合

3、函數遞歸的理解

3.1 遞歸的定義

函數定義中調用函數自身的方式

032-代碼複用與函數遞歸-01.jpg?x-oss-process=style/watermark

3.2 遞歸的兩個關鍵特徵

  • 鏈條:計算過程存在遞歸鏈條
  • 基例:存在一個或多個不須要再次遞歸的基例

3.3 相似數學概括法

  • 數學概括法
    • 證實當n取第一個值\(n_0\)時命題成立
    • 假設當\(n_k\)時命題成立,證實當\(n=n_k+1\)時命題也成立
  • 遞歸是數學概括法思惟的編程體現

4、函數遞歸的調用過程

4.1 遞歸的實現

\[ n!= \begin{cases} 1 & n=0 \\ n(n-1)! & \text{otherwise} \end{cases} \]

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n - 1)

4.2 函數 + 分支語句

  • 遞歸自己是一個函數,須要函數定義方式描述
  • 函數內部,採用分支語句對輸入參數進行判斷
  • 基例和鏈條,分別編寫對應代碼

4.3 遞歸的調用過程

032-代碼複用與函數遞歸-02.jpg?x-oss-process=style/watermark

5、函數遞歸實例解析

5.1 字符串反轉

將字符串s反轉後輸出:s[::-1]

  • 函數 + 分支結構
  • 遞歸鏈條
  • 遞歸基例
def rvs(s):
    if s == "":
        return s
    else:
        return rvs(s[1:]) + s[0]

5.2 斐波那契數列

斐波那契數列

\[ F(n)= \begin{cases} 1 & n=1 \\ 1 & n=1 \\ F(n-1)+F(n-2) & otherwise \end{cases} \]

\(F(n) = F(n-1) + F(n-2)\)

  • 函數 + 分支結構
  • 遞歸鏈條
  • 遞歸基例
def f(n):
    if n == 1 or n == 2:
        return 1
    else:
        return f(n - 1) + f(n - 2)

5.3 漢諾塔

032-代碼複用與函數遞歸-03.jpg?x-oss-process=style/watermark

  • 函數 + 分支結構
  • 遞歸鏈條
  • 遞歸基例
def hanoi(n, src, dst, mid):
    global count
    if n == 1:
        print("{}:{}->{}".format(1, src, dst))
        count += 1
    else:
        hanoi(n - 1, src, mid, dst)
        print("{}:{}->{}".format(n, src, dst))
        count += 1
        hanoi(n - 1, mid, dst, src)


count = 0
hanoi(3, 'A', 'B', 'C')
print(count)
1:A->B
2:A->C
1:B->C
3:A->B
1:C->A
2:C->B
1:A->B
7

6、單元小結

6.1 代碼複用與函數遞歸

  • 模塊化設計:鬆耦合、緊耦合
  • 函數遞歸的2個特徵:基例和鏈條
  • 函數遞歸的實現:函數 + 分支結構
相關文章
相關標籤/搜索