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


推荐阅读
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文介绍了Python异常的捕获、传递与抛出操作,并提供了相关的操作示例。通过异常的捕获和传递,可以有效处理程序中的错误情况。同时,还介绍了如何主动抛出异常。通过本文的学习,读者可以掌握Python中异常处理的基本方法和技巧。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
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社区 版权所有