前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python实现——ASCII谢尔宾斯基地毯

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

作者头像
全栈程序员站长
发布2022-09-14 10:18:03
5260
发布2022-09-14 10:18:03
举报
文章被收录于专栏:全栈程序员必看

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

目录

一、题目内容:

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

二、思路:

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

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

三、python代码:

代码语言:javascript
复制
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.cn/158442.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年7月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、思路:
  • 三、python代码:
  • 4、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档