《数据结构与算法分析python版》第五周编程作业

《数据结构与算法分析python版》第五周编程作业

1进制转换

题目内容:

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

输入格式:

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

输出格式:

一行字符串,表示转换后的N进制数

输入样例:

8 16
‭473‬

输出样例:

‭13B

脚本

def to10(numlst,M):
	num_10 = int(numlst,base=M)
	return num_10

def toStr(n,base):
    convertString="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    if n < base:
        return convertString[n]
    else:
        return toStr(n//base,base) + convertString[n%base]



M,N = map(int,input().split(" ")
numlst=input()
n = to10(numlst,M)
base = N
print(toStr(n,base))

2、四柱汉诺塔

题目内容:

如课上所说,汉诺塔问题源于印度一个古老传说。对于原始的汉诺塔游戏,可供玩家操作的空间一共只有三根柱子,导致按原传说的要求,需要超过1.8*10^19步才能解开。

透过新增柱子可以大幅度地减少需要的步数。此处要求在给出指定的盘数,柱子数量为4(即限制为4根柱子)且不改变原有传说的其他规则的限制下,找出完成迁移的最小步骤数。

输入格式:

一个非负整数M,M代表盘数,M<=1000。

输出格式:

一个非负整数,表示完成迁移的最小步骤数。

输入样例:

3

输出样例:

5

思路整理:

1、首先还是得从递归算法的三个基本原则出发:
1)必须有基本情况:这里就是只有一个盘子
2)必须改变其状态并向基本情况靠近:
这里去分析他的一个向基本情况变化的过程:
《数据结构与算法分析python版》第五周编程作业_第1张图片
所以在这里是存在一个最小值的比较min(preResult,2f(i)+2**(n-i)-1,另外由于这个过程中涉及到很多重复的运算,所以需要运用一下动态规划的内容,先用循环自下而上建立查询表,同时用递归自上而下去根据查询表获得结果。所以这里的基本情况转化为了在表中查询到结果,return结果,本次递归结束,进入下一轮循环迭代(return代表结束,之前这里没有搞懂)
-----------------------------------这是理解递归过程的一个非常好的栗子----------------------------------------------
举个简单的栗子:
《数据结构与算法分析python版》第五周编程作业_第2张图片

脚本

def Hanoi_T_4(n):
    Tower_list = [0] * (n + 1)  #建立查询表
 
    def f(m):
        if Tower_list[m]:  # 如果在递归过程中,有存储的结果,直接返回。
            return Tower_list[m]  # 这里得到rerun值以后,本次递归就算结束了。而不会继续进行下面result的赋值
        result = 2 ** m - 1  
        for x in range(1, m):   
            result = min(result, 2 * f(x) + 2 ** (m - x) - 1)
        Tower_list[m] = result
        return result
 
    return f(n)
print(Hanoi_T_4(int(input())))

3、ASCII谢尔宾斯基地毯

题目内容:

《数据结构与算法分析python版》第五周编程作业_第3张图片

谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中中央挖空,其余均由更小的地毯组成。

现给定地毯大小(行数)与组成地毯的字符元素,请打印相应的地毯图形。

注:空腔以半角空格表示;当给定字符元素长度不为1时空格数须与字符长度对应

输入格式:

输入为两行,分别为地毯大小正整数N与组成元素字符串c

输入数据保证N为3的正整数幂

输出格式:

由N行长度为N*len©的字符串构成的谢尔宾斯基地毯

输入样例:

9
[]

输出样例:

《数据结构与算法分析python版》第五周编程作业_第4张图片

思路整理:

1、看这个图该怎么输出,比较合适的是通过print函数,直接一行一行打印,那着了就可以直接用两个循环来打印。那么在这个过程中就碰到问题了,就是确定一个什么条件来空开空白的内容。
2、所以就需要给每一步加一个判断条件,每一步如果是位于空白点,则打印空白,否则打印char
通过具体的图像来分析这个过程:
《数据结构与算法分析python版》第五周编程作业_第5张图片
这里只是得到了递归的判断条件,由于i,j 是最大阶的值,所以在递归过程中需要随着递归过程调整。
《数据结构与算法分析python版》第五周编程作业_第6张图片

脚本

def carpet(N,char):
    def checkblank(n,i,j):
        if n <= 1:
            return True
        n2 = n/3
        if n2 < i <= n2 * 2 and n2 < j <= n2 * 2:
            return False
        return checkblank(n2,i%n2,j%n2)
    
    
    for i in range(1,N+1):
        for j in range(1,N+1):
            if checkblank(N,i,j):
                print(char,end = "")
            else:
                print(" "*len(char),end = "")
        print('')
 
n=int(input())
c=input()
carpet(n,c)

注:参考了suxiaorui的博客分享内容,记录了自己的一些理解:
参考来源地址:点击转入

你可能感兴趣的:(《数据结构与算法分析python版》第五周编程作业)