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怎么出来的,当把规模变大,还是一样的解决办法。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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