使用Python递归打印'*'图案

-1 投票
1 回答
2212 浏览
提问于 2025-04-18 08:10

我想创建一个递归函数 f(),这个函数需要两个非负整数作为参数,并输出一个星号的图案。第一个参数表示图案的缩进程度,第二个参数表示图案中最长一行的星号数量,并且这个数量总是2的幂。

举个例子:

>>>f(0, 0)
>>>f(0, 1)
*
>>>f(0, 2)
*
**
 *
>>>f(0,4)
*
**
 *
****
 *
 **
  *

到目前为止,我已经有了:

def f(x,y):
s='*'
if y is 1:
    print(s)
elif y>1:
    print(s)
    print(s*y)
print(s)

我还不知道怎么实现这个图案。还有,我也不知道怎么让输出的每一行都按照需要进行缩进。

1 个回答

3

这样怎么样:

def f(indent, num):
    if(num > 0):
        f(indent, num//2);               # print previous pattern
        print(" "*indent + "*"*num);     # print middle row of *'s
        f(indent + 1, num//2);           # print previous pattern indented

输出结果:

f(0,0)   f(0,1)   f(0,2)   f(0,4)     f(0, 8)
           *        *         *          *
                    **        **         **
                     *         *          *
                              ****       ****
                               *          *
                               **         **
                                *          *
                                         ********
                                          *
                                          **
                                           *
                                          ****
                                           *
                                           **
                                            *

对称变化

如果你想要更对称的效果,可以试试这个变化:

def f(indent, num):
    if(num > 0):
        f(indent, num//2);
        print(" "*indent + "*"*num);
        f(indent + num//2, num//2);        # indent by num//2 instead of 1

输出结果:

f(0,0)   f(0,1)   f(0,2)   f(0,4)     f(0, 8)
           *        *         *          *
                    **        **         **
                     *         *          *
                              ****       ****
                                *          *
                                **         **
                                 *          *
                                         ********
                                             *
                                             **
                                              *
                                             ****
                                               *
                                               **
                                                *

撰写回答