python实现——ASCII谢尔宾斯基地毯

python实现——ASCII谢尔宾斯基地毯目录一、题目内容:二、思路:三、python代码:4、总结一、题目内容:二、思路:看到这个图案,肯定是自相似的,所以肯定用递归解决这个问题。但是具体怎样的呢?(1)这个其实就是二维矩阵,所以是要判断每个位置是不是要填给定字符,如果确定了每个位置填或不填,那不就解决问题了嘛;(2)用两个for循环不就遍历了所有的位置了么,所以这个也简单,现在的难点在于如何知道每个位置要填,所以用一个函数判断;(3)这个判断的函数需要三个参数,一个是边长数,另外两个是坐标。边界条件是n=1就返回T.

大家好,又见面了,我是你们的朋友全栈君。

一、题目内容:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、思路:

看到这个图案,肯定是自相似的,所以肯定用递归解决这个问题。
但是具体怎样的呢?
(1)这个其实就是二维矩阵,所以是要判断每个位置是不是要填给定字符,如果确定了每个位置填或不填,那不就解决问题了嘛;
(2)用两个for循环不就遍历了所有的位置了么,所以这个也简单,现在的难点在于如何知道每个位置要填,所以用一个函数判断;
(3)这个判断的函数需要三个参数,一个是边长数,另外两个是坐标。边界条件是n=1就返回True(只有一个位置,那肯定要填的);另一种情况是判断坐标是不是在中间,在中间则不填,返回False;如果上述两种情况都不是,那就递归自身寻找答案,至于里面的参数,肯定是要减小规模的,边长除以3取商好理解,坐标不是太好理解的,需要自己去试,比如下面这两个位置,其实就是同一个问题的更小规模,取余正好就得到了答案。
在这里插入图片描述

三、python代码:

def carpet(n, char):
    def check(n, x, y):  # 难点在这个判断函数,使用了递归
        if n<=1:  # 边界条件(只有一个位置,那肯定要填的)
            return True
        n2 = n // 3
        if n2<=x<n2*2 and n2<=y<n2*2:  #正方形中间的位置不填
            return False
        
        # 前两种情况都不是,这个位置是否填,需要递归调用才能知道,
        # 里面的3个参数都需要减小规模,n2为边长(取商),x,y是坐标位置,
        # 取余就是减小规模对应的子位置。
        return check(n2, x%n2, y%n2) 

    for x in range(n):
        for y in range(n):
            if check(n, x, y):
                print(char, end='')
            else:
                print(' '*len(char), end='')  # 这个是输入空格的情况
        print('')
    
if __name__ == "__main__":
   n = int(input())
   char = input()
   carpet(n, char)

4、总结

(1)看到这种在二维矩阵的图案或者字母啥的,肯定是要遍历每个位置的,用两个for循环;
(2)对于大问题是由小问题组成的,需要用递归,用递归的时候,三要素(边界条件、减小规模、调用自身)要注意。不要想每一步怎么出来的,要站在一定的高度想问题,也就是说,想最小的问题是怎么解决的,那整个问题就是怎么解决的,所以每次就按最小问题来写代码。如本题中,你就想成3×3的正方形,3×3怎么出来的,当把规模变大,还是一样的解决办法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158442.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • supervisor命令出现 unix:///tmp/supervisor.sock no such file[通俗易懂]

    supervisor命令出现 unix:///tmp/supervisor.sock no such file[通俗易懂]supervisor命令出现 unix:///tmp/supervisor.sock no such file

    2022年4月24日
    40
  • C语言数组初始化

    C语言数组初始化转载博客代码编译运行环境:VS2017+Win32+Debug1.字符数组的初始化方式C语言中表示字符串有两种方式,数组和指针,字符数组是我们经常使用的方式。变量的定义包括指明变量所属类型、变量名称、分配空间以及初始化。可以看出,变量的初始化是变量定义的一部分。除了const变量需要显示初始化以外,其它变量如果在定义时未显示初始化,编译器会为变量以默认…

    2022年7月18日
    19
  • 监控流媒体服务器的搭建和使用_rtmp推流服务器

    监控流媒体服务器的搭建和使用_rtmp推流服务器当我们从网络摄像头上接收视频时,首先要了解协议(RTSP/RTMP/HTTP),然后是解码格式(MKV,RMVB),之后才是将视频(H264)和音频(AAC)格式数据分别解码为图像(RGB/YUV)和声音(PCM),再根据时间戳同步到流媒体平台(比如视频直播点播平台EasyDSS)播放。本文和大家讲一下视频流媒体服务器中RTMP和RTSP区别是什么?大家都知道我们研发的不同视频流媒体服务器是接入不同协议的,国标流媒体服务器接入GB28181协议,而视频直播点播流媒体服务器就是接入RTSP和RTMP协

    2022年10月20日
    3
  • python动态心形代码简单_python 心形

    python动态心形代码简单_python 心形0.最终效果1.绘制一条心形曲线最近看到个视频,打算绘制个心型动态的曲线。1.1Matlab确定图像及其函数网上有很多关于心形曲线的资料,各种各样的形状,但是我比较倾心于桃心形。先在Matlab里简单看一下是什么样的。桃心形曲线的方程如下x=16sin^3(t)y=13cos(t)-5cos(2t)-2cos(3t)-cos(4t)Matlab绘制效果如下:Matlab程序如下。clcc…

    2022年9月25日
    2
  • EVE模拟器的使用-带图超详细(学网络用)「建议收藏」

    EVE模拟器的使用-带图超详细(学网络用)「建议收藏」文章目录EVE模拟器的安装EVE模拟器的使用登陆添加一个实验退出一个实验实验分类创建任务(添加路由交换机)选择型号和种类说明修改已创建种类参数界面放大和缩小方式一方式二种类(设备)之间连线和删除连线连线删线添加注释信息(描述)设备开机开启单个设备开启所有设备设备功能配置软件抓包EVE模拟器的安装EVE模拟器的下载及安装见:EVE模拟器的使用登陆根据上面安装步骤进入到这个界面以后:用户名:admin密码:unl(小写L)登陆方式:Nativeconsole登陆成功以后就是这个界面:添

    2022年4月27日
    485
  • Python 之 cPickle用法

    Python 之 cPickle用法序列化就是通过特殊的方法将数据存储到相应存储区的过程,反序列化就是依据数据序列化时的规则进行反向执行,以取出原数据的过程。在编写程序的过程中,我们有时需要将数据进行序列化与反序列化的操作,本篇博客旨在阐述序列化与反序列化的作用及举例说明几个常用方法的使用。

    2022年6月24日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号