一、整数转换为任意进制
❖
我们用最熟悉的十进制分析下这个问题
十进制有十个不同符号:
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的海龟作图系统turtle module
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()
运行结果为: