資料結構與演算法 遞迴演算法(Python版)

2021-10-04 03:43:08 字數 3973 閱讀 7177

一、整數轉換為任意進製

我們用最熟悉的十進位制分析下這個問題

十進位制有十個不同符號:

convstring =

"0123456789"

比十小的整數

,轉換成十進位制,

直接查表

就可以

了:

convstring[n]

想辦法把比十大的整數,拆成一系列比十小的整

數,逐個查表,

比如七百六十九,拆成

七、六、九,查表得到

769

就可以了

所以,在遞迴三定律裡,我們找到了

本結束條件

,就是小於十的整數

拆解整數的過程就是向「基本結束條件」演進的

過程

我們用

整數除

,和

求餘數

兩個計算來將整

數一步步拆開

除以「進製基

base

」(

// base

對「進製基」求餘數(

% base

問題就分解為:

餘數

總小於「進製基

base

」,是「

基本結束條件

」,可直接進行查表轉換

整數商

成為「

更小規模

」問題,通過

遞迴呼叫自

解決

在除錯遞迴演算法程式的時候經常會碰到這

樣的錯誤:

recursionerror

遞迴的層數太多,系統呼叫棧容量有限

python

內建的

sys

模組可以獲取和調整

最大遞迴深度

整數轉換為任意進製的**:

def tostr(n,base):

converstring = "0123456789abcdef"

if n < base:

return converstring[n] #最小規模

else:

#減小規模呼叫自身

return tostr(n//base,base) + converstring[n%base]

print(tostr(1453,16))

前面的種種遞迴演算法展現了其簡單而強大

的一面,但還是難有個直觀的概念

下面我們通過遞迴作圖來展現遞迴呼叫的

視覺影像

python的海龜作圖系統turtlemodule

python內建,隨時可用,以logo語言的創意為基礎其意象為模擬海龜在沙灘上爬行而留下的足跡:

爬行:forward(n); backward(n)

轉向:left(a); right(a)

抬筆放筆:penup(); pendown()

筆屬性:pensize(s); pencolor(c)

這樣,我們可以把樹分解為三個部分:樹

幹、左邊的小樹、右邊的小樹

分解後,正好符合遞迴的定義:對自身的呼叫

分型樹**:

import turtle 

#branch_len 分支長度

def tree(branch_len):

#樹幹太短不畫,即遞迴結束條件

if branch_len > 5:

t.forward(branch_len) #畫樹幹

t.right(20) # 向左傾斜20度

#遞迴呼叫,畫右邊的小樹,樹幹減15

tree(branch_len - 15)

t.left(40) #向左轉40度,即向左傾斜20度

#遞迴呼叫,畫左邊的小樹,樹幹減去15

tree(branch_len - 15)

t.right(20) #向右回20度,即回正樹幹

t.backward(branch_len) #海龜退回原位置

t = turtle.turtle()

t.left(90)

t.penup()

t.backward(100)

t.pendown()

t.pencolor('green')

t.pensize(2)

tree(75)

t.hideturtle()

turtle.done()

執行結果為:

資料結構與演算法 遞迴

一 概念 遞迴是一種高效 簡介的編碼技巧,一種應用很廣泛的演算法,比如dfs深度優先搜尋,前中後序二叉樹遍歷等都是使用遞迴。方法或函式呼叫自身的方式成為遞迴呼叫,呼叫稱為遞,返回成為歸 所有遞迴問題都可以用遞迴公式來表示 二 遞迴優缺點 優點 簡潔 缺點 堆疊溢位風險 可根據調整遞迴呼叫的最大深度來...

資料結構與演算法 認識遞迴

淺識 1 遞迴與迴圈 理論上,任何迴圈都可以重寫為遞迴形式 有些語言沒有迴圈語句,只能使用遞迴。2 迴圈改遞迴 1 發現邏輯 相似性 2 一定要有 出口 不然就會死迴圈 3 構造相似性 如果沒有明顯的相似性,可能是缺少引數,需要主動構造,與遞推類似 4 遞迴呼叫 1 遞迴呼叫僅僅是被調函式正好是主調...

11 資料結構與演算法 遞迴

created by chen da 階乘函式就是典型的遞迴 def fact n if n 0 return 1 else return n fact n 1 遞迴的特點 遞迴必須包含乙個基本的出口 base case 否則就會無限遞迴,最終導致棧溢位。比如這裡就是n 0時返回1.遞迴必須包含乙個...