热门标签 | 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)


推荐阅读
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
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社区 版权所有