python递归打印'*'的模式

时间:2014-06-01 01:20:17

标签: python recursion

我想创建一个递归函数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 个答案:

答案 0 :(得分: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)
           *        *         *          *
                    **        **         **
                     *         *          *
                              ****       ****
                                *          *
                                **         **
                                 *          *
                                         ********
                                             *
                                             **
                                              *
                                             ****
                                               *
                                               **
                                                *