【Python 15】分形樹繪製3.0(遞歸函數)

1.案例描述算法

 將遞歸函數與循環函數結合繪製2.0的圖形數據結構

2.案例分析函數

 

3.上機實驗性能

""" 做者:梁斌 功能:五角星的繪製 版本:3.0 日期:03/08/2017 新增功能:加入循環操做繪製重複不一樣大小的圖形 新增功能:使用迭代函數繪製重複不一樣大小的圖形 """
import turtle def draw_pentagram(size): """ 繪製五角星 """
    # 計數器
    count = 1
    while count <= 5: turtle.forward(size) turtle.right(144) # count = count + 1
        count += 1


def draw_recursive_pentagram(size): """ 迭代繪製五角星 """
    # 計數器
    count = 1
    while count <= 5: turtle.forward(size) turtle.right(144) # count = count + 1
        count += 1

    # 五角星繪製完成,更新參數
    size += 10
    if size <= 100: draw_recursive_pentagram(size) def main(): """ 主函數 """ turtle.penup() turtle.backward(200) turtle.pendown() turtle.pensize(2) turtle.pencolor('red') size = 50 draw_recursive_pentagram(size) turtle.exitonclick() if __name__ == '__main__': main()

4.遞歸函數spa

遞歸(Recursion)是指在函數的定義中使用函數自身的方法。遞歸就是有去(遞去)有回(歸來)。.net

(1)遞歸三要素:設計

  • 明確遞歸終止條件;code

  • 給出遞歸終止時的處理辦法;blog

  • 提取重複的邏輯,縮小問題規模。遞歸

(2)遞歸典型算法設計模型

  • 在遞去的過程當中解決問題
function recursion(大規模){ if (end_condition){      // 明確的遞歸終止條件
        end;   // 簡單情景
    }else{            // 在將問題轉換爲子問題的每一步,解決該步中剩餘部分的問題
        solve;                // 遞去
        recursion(小規模);     // 遞到最深處後,不斷地歸來
 } }
  • 在歸來的過程當中解決問題
function recursion(大規模){ if (end_condition){      // 明確的遞歸終止條件
        end;   // 簡單情景
    }else{            // 先將問題所有描述展開,再由盡頭「返回」依次解決每步中剩餘部分的問題
        recursion(小規模);     // 遞去
        solve;                // 歸來
 } }

 Python實例(同時包含遞去處理和歸來處理)

# 樹枝長度小於5時終止,每次樹枝長度減小15(繪製右側樹枝後,原路返回到起點)
def
draw_branch(branch_length): if branch_length < 5: return else: # 繪製右側樹枝 turtle.forward(branch_length) print('向前 ', branch_length) turtle.right(20) print('右轉 20') draw_branch(branch_length - 15) # 返回以前的樹枝 turtle.left(20) print('左轉 20') turtle.backward(branch_length) print('向後 ', branch_length)

(3)遞歸與循環

  • 遞歸與循環是兩種不一樣的解決問題的典型思路,遞歸求解方式和循環求解方式每每能夠互換。
  • 遞歸能夠很清晰地描述了一個問題的求解過程,比循環更容易理解。但遞歸涉及函數調用開銷,經常會帶來性能問題,因此效率會比循環要低。
  • 建議在不影響程序的閱讀的前提下,儘可能使用循環,而不用遞歸。

 (4)遞歸使用場景(第三種最多見)

  • 問題的定義是按遞歸定義的(Fibonacci函數,階乘,…);
  • 問題的解法是遞歸的(有些問題只能使用遞歸方法來解決,例如,漢諾塔問題,…);
  • 數據結構是遞歸的(鏈表、樹等的操做,包括樹的遍歷,樹的深度,…)。

5.Pycharm技巧

(1)選中多行代碼,Ctrl+l按一次註釋,按兩次取消註釋。

(2)選中多行代碼,Tab鍵縮行,Shift+Tab反向縮行。

(3)Alt + 上箭頭,代碼上移;Alt+下箭頭,代碼下移。

 

參考文檔:

算法設計方法:遞歸的內涵與經典應用

相關文章
相關標籤/搜索