数据结构与算法Python版 递归与可视化


一、递归

递归Recursion是一种解决问题的方法

  • 将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。
  • 递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身
  • 递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单。

重要:递归“三定律”

  • 递归算法必须有一个基本结束条件(最小规模问题的直接解决)
  • 递归算法必须能改变状态向基本结束条件演进(减小问题规模)
  • 递归算法必须调用自身(解决减小了规模的相同问题)

示例:使用递归对数列进行求和

  • 数列的和=“首个数”+“余下数列”的和
  • 如果数列包含的数少到只有1个的话,它的和就是这个数了。这是规模小到可以做最简单的处理
    • 问题分解为更小规模的相同问题,并表现为“调用自身
    • 对“最小规模”问题的解决:简单直接
      在这里插入图片描述
def list_sum(num_list):
    if len(num_list) == 1:  # 基本结束条件
        return num_list[0]
    else:
        # 减少规模,向长度为1的状态演进,并调用自身
        return num_list[0] + list_sum(num_list[1:])  


list1 = [1, 3, 5, 7, 9]
print(list_sum(list1))


### 输出结果
25

二、递归实现分析

当一个函数被调用的时候,系统会把调用时的现场数据压入到系统调用栈

  • 每次调用,压入栈的现场数据称为栈帧
  • 当函数返回时,要从调用栈的栈顶取得返回地址,恢复现场,弹出栈帧,按地址返回。
    在这里插入图片描述

Python中的递归深度限制

  • Python中的递归深度限制,默认最大递归深度为1000。超过最大递归深度会出现RecursionError错误。
  • 这时候要检查程序中是否忘记设置基本结束条件,导致无限递归。
import sys

print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())


### 输出结果
1000
2000

三、递归可视化-分形树

Python内置turtle海龟绘图模块模拟海龟在沙滩上爬行而留下的足迹

动作类别 方法名 参数 说明
爬行 forward(n) n 向前爬行n个单位长度
爬行 backward(n) n 向后爬行n个单位长度
转向 left(a) a 向左转动a度
转向 right(a) a 向右转动a度
抬笔放笔 penup() 抬起画笔,移动时不画线
抬笔放笔 pendown() 放下画笔,移动时开始画线
笔属性 pensize(s) s 设置画笔线条的粗细为s
笔属性 pencolor© c<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值