热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构与算法python版MOOC第五周

五、递归-上本系列博客基于“(北京大学)数据结构与算法python版”慕课,课程在中国大学慕课和bilibili上均可找到。1.内容递归三定律:算
五、递归-上

本系列博客基于“ (北京大学)数据结构与算法python版”慕课,课程在中国大学慕课和bilibili上均可找到。

1. 内容


  1. 递归三定律:算法有一个基本结束条件,算法会改变状态向基本结束条件演化,算法需要调用自身
  2. 递归的应用:任意进制转换,分形树,谢尔宾斯基三角形,汉诺塔,探索迷宫
  3. 海龟作图介绍

2. 课程代码

在GitHub中下载

3. OJ作业

所有代码均可在github中下载

3.1 进制转换

题目内容:
   给定一个M进制的数,请将其转换为N进制并输出

输入格式: 两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N;其中M, N均满足2 ≤ M、N ≤ 36。第二行为待转换的M进制数字,其中每位超过9的部分从10至36分别用大写字母A-Z表示;输入数据保证数据的每一位不超过M
输出格式:一行字符串,表示转换后的N进制数

输入样例:
8 16
‭471‬
输出样例:
‭139
方法:先把输入转为十进制 再构建一个convert_ten_other函数进行递归

number = [str(i) for i in range(10)]
big_letter = [chr(i) for i in range(65, 91)]
num_string = number+big_letter # 存储输出数字的每个字符def func(in_number, m, n):# 将输入转为10进制in_sum = 0for i in range(len(in_number)):current_character = in_number[len(in_number)-i-1] # 当前要计算的位数的字符in_sum = in_sum+num_string.index(current_character)*pow(m, i)out_number = convert_ten_other(in_sum, n)return out_number# 十进制转其他进制的递归函数
def convert_ten_other(in_number, base):if in_number == 0:return ''else:return convert_ten_other(in_number//base, base) + num_string[in_number % base]#
m, n = list(map(int, input().split()))
in_number = input()
print(func(in_number, m, n))

3.2 四柱汉诺塔

题目内容:

   如课上所说,汉诺塔问题源于印度一个古老传说。对于原始的汉诺塔游戏,可供玩家操作的空间一共只有三根柱子,导致按原传说的要求,需要超过1.8*10^19步才能解开。
   透过新增柱子可以大幅度地减少需要的步数。此处要求在给出指定的盘数,柱子数量为4(即限制为4根柱子)且不改变原有传说的其他规则的限制下,找出完成迁移的最小步骤数。

输入格式: 一个非负整数M&#xff0c;M代表盘数&#xff0c;M<&#61;1000。
输出格式&#xff1a; 一个非负整数&#xff0c;表示完成迁移的最小步骤数。

输入样例&#xff1a;
3
输出样例&#xff1a;
5

方法&#xff1a;
   输入M代表盘数 输出为完成迁移的最小步骤数。四柱汉诺塔的步骤如下

  1. 4柱汉诺塔算法把A柱上部分的n- r个碟子通过C柱和D柱移到B柱上【F( n- r )步】
  2. 用3柱汉诺塔经典算法把A柱上剩余的r个碟子通过C柱移到D柱上【2^r-1步】
  3. 用4柱汉诺塔算法把B柱上的n-r个碟子通过A柱和C柱移到D柱上【F(n-r)步】
  4. 求出所有r情况下的步数&#xff0c;取最小值
    可以发现每个n的最小步数是一个斐波那契数列&#xff0c;所以得到最小步数公式为 F(n)&#61;min(2*F(n-r)&#43;2^r-1)&#xff0c;&#xff08;1≤r≤n&#xff09;。
    代码

def calculate_min_step(m):min_step_list &#61; [0]*(m&#43;1) # 存储每种盘子数下的最小步数for n in range(1, m&#43;1): # 在n个盘的情况下n_max &#61; 1e10 # 先把n个盘的步数设为一个很大的数for r in range(1, n&#43;1):n_sum &#61; 2*min_step_list[n-r]&#43;pow(2, r)-1 # 在r为某值时&#xff0c;移动n个盘需要的步数if n_sum < n_max:n_max &#61; n_summin_step_list[n] &#61; n_max# print(min_step_list)# print(min_step_list[m])return min_step_list[m]m &#61; int(input())
print(calculate_min_step(m))

3.3 ASCII谢尔宾斯基地毯


在这里插入图片描述

   谢尔宾斯基地毯是形如上图的正方形分形图案&#xff0c;每个地毯可分为等大小的9份&#xff0c;其中中央挖空&#xff0c;其余均由更小的地毯组成。
   现给定地毯大小&#xff08;行数&#xff09;与组成地毯的字符元素&#xff0c;请打印相应的地毯图形。
   注&#xff1a;空腔以半角空格表示&#xff1b;当给定字符元素长度不为1时空格数须与字符长度对应

输入格式: 输入为两行&#xff0c;分别为地毯大小正整数N与组成元素字符串c。输入数据保证N为3的正整数幂
输出格式&#xff1a;由N行长度为N*len©的字符串构成的谢尔宾斯基地毯

输入样例&#xff1a;
9
[]

输出样例&#xff1a;
[][][][][][][][][]
[] [][] [][] []
[][][][][][][][][]
[][][] [][][]
[] [] [] []
[][][] [][][]
[][][][][][][][][]
[] [][] [][] []
[][][][][][][][][]

方法&#xff1a;空腔以半角空格表示&#xff1b;当给定字符元素长度不为1时空格数须与字符长度对应。输入为两行分别为地毯大小正整数N与组成元素字符串c。输出为由N行长度为N * len(c&#xff09;的字符串构成的谢尔宾斯基地毯
   先构造一个N*N的空格矩阵 空格的长度由字符串长度决定。递归赋值 当N//3&#61;&#61;0 直接赋值字符串 其余情况 找到四周八个正方形&#xff0c;调用函数&#xff0c;
   oj显示格式错误&#xff0c;不知道什么原因

# 主函数
def carpet(N, char):char_len &#61; len(char)global string_matrixblank &#61; &#39; &#39;*char_len # 填充空格大小dstring_matrix &#61; [[blank]*N for i in range(N)] # 初始化矩阵draw_square(N, char, 0, 0)# 打印地毯for i in range(N): # 行print_string &#61; &#39;&#39;.join(item for item in string_matrix[i])print(print_string)print(&#39;\n&#39;)return# 画地毯递归函数
def draw_square(n, char, x, y): # 注意 n是当前正方形边长&#xff0c;x是正方形左上顶点行号&#xff0c;y是左上顶点列号if n//3 &#61;&#61; 0:string_matrix[x][y] &#61; charreturnelse:point_list &#61; compute_point(n, x, y)for item in point_list:draw_square(n//3, char, item[0], item[1])return# 计算周围正方形的坐标
def compute_point(n, x, y):point_list &#61; [] # 按照顺时针方向 x是竖着 y是横着sl &#61; n//3 # 小正方形边长point_list.append([x, y]) # 1point_list.append([x, y&#43;sl]) # 2point_list.append([x, y&#43;2*sl]) # 3point_list.append([x&#43;sl, y&#43;2*sl]) # 4point_list.append([x&#43;2*sl, y&#43;2*sl]) # 5point_list.append([x&#43;2*sl, y&#43;sl]) # 6point_list.append([x&#43;2*sl, y]) # 7point_list.append([x&#43;sl, y]) # 8return point_listn &#61; int(input())
c &#61; input()
carpet(n, c)


推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • Python 编程技巧:实现字符串中字符大小写的转换 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 开发日志:高效图片压缩与上传技术解析 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • Python默认字符解析:深入理解Python中的字符串处理
    在Python中,字符串是编程中最基本且常用的数据类型之一。尽管许多初学者是从C语言开始接触字符串,通常通过经典的“Hello, World!”程序入门,但Python对字符串的处理方式更为灵活和强大。本文将深入探讨Python中的字符串处理机制,包括字符串的创建、操作、格式化以及编码解码等方面,帮助读者全面理解Python字符串的特性和应用。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 针对图像分类任务的训练方案进行了优化设计。通过引入PyTorch等深度学习框架,利用其丰富的工具包和模块,如 `torch.nn` 和 `torch.nn.functional`,提升了模型的训练效率和分类准确性。优化方案包括数据预处理、模型架构选择和损失函数的设计等方面,旨在提高图像分类任务的整体性能。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
author-avatar
宝一一0702
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有