数据结构与算法----递归算法(Python版)

一、整数转换为任意进制
我们用最熟悉的十进制分析下这个问题
十进制有十个不同符号: 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()

运行结果为:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值