一、整數轉換為任意進製
❖我們用最熟悉的十進位制分析下這個問題
十進位制有十個不同符號:
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.遞迴必須包含乙個...