递归打印数字金字塔

时间:2018-11-29 10:23:45

标签: python recursion

我必须按照以下规则打印数字金字塔:

奇数索引:1到索引, 偶数索引:索引为1:

1
21
123
4321
12345
654321
1234567
87654321
123456789

我写了这段代码:

def printFigure(rows):
    if rows > 0:
        if rows%2 == 0:
            printFigure(rows-1)
            while(rows>0):
                print(str(rows)[::-1], end = '')
                rows -= 1
            print('')

        if rows%2 == 1:
            printFigure(rows-1)
            while (rows>0):
                print(str(rows),end = '')
                rows -= 1
            print('')

但输出为:

1
21
321,
4321
54321
654321
7654321
87654321
987654321

我是递归的初学者,我也很高兴为您提供解释。 谢谢。

5 个答案:

答案 0 :(得分:4)

当前代码有两个主要问题。首先,应该在对rows进行递归调用之后 检查printFigure是偶数还是奇数。原因是在从递归调用中退出后,您决定决定按顺序或向后打印行。

第二个问题是else打印条件下的逻辑。您需要从1开始打印,直到行数为止。我使用了一个虚拟变量来实现这一目标,尽管可能还有其他几种方式。

def printFigure(rows):
    if rows > 0:
        printFigure(rows-1)
        if rows%2 == 0:
            while(rows>0):
                print(str(rows)[::-1], end='')
                rows -= 1
            print('')
        else:
            i = 1
            while (i <= rows):
                print(str(i), end='')
                i += 1
            print('')

printFigure(9)

1
21
123
4321
12345
654321
1234567
87654321
123456789

答案 1 :(得分:3)

如果您不需要使用递归,则另一个简单的解决方案是:

def printFigure(rows): 
    for x in range(rows): 
        items = [str(i) for i in range(1, x + 1)] 
        if x % 2 == 0: 
            items = items[::-1] 
        print(''.join(items))

答案 2 :(得分:2)

您可以使用从下至上打印的内部函数,然后从外部函数调用此函数,例如:

def print_rows(n, limit):
    if n < limit:
        numbers = range(1, n + 1) if n % 2 == 1 else reversed(range(1, n + 1))
        print(''.join(map(str, numbers)))
        print_rows(n + 1, limit)


def print_pyramid_recursive(n):
    if n > 0:
        print_rows(1, n)


print_pyramid_recursive(10)

输出

1
21
123
4321
12345
654321
1234567
87654321
123456789

在这种情况下,内部函数为print_rows,外部函数为print_pyramid_recursive。请注意,此问题具有非常简单的非递归解决方案,例如:

def print_pyramid(n):
    for i in range(1, n + 1):
        numbers = range(1, i + 1) if i % 2 == 1 else reversed(range(1, i + 1))
        print(''.join(map(str, numbers)))

答案 3 :(得分:2)

这是最简单的循环版本:

is_reversed = False
for i in range(1, 10):
    step = -1 if is_reversed else 1
    print(''.join(map(str, range(1, i + 1)))[::step])
    is_reversed = not is_reversed

每次迭代都会重新生成一个字符串。我们还可以存储先前结果的值并以此为基础:

s = ''
is_reversed = False
for i in range(1, 10):
    s += str(i)
    step = -1 if is_reversed else 1
    print(s[::step])
    is_reversed = not is_reversed

当然,只需通过栈即可轻松地(毫无意义地)将其转换为尾递归函数:

def f(s, i, max_i, is_reversed):
    if i == max_i:
        return
    s += str(i)
    step = -1 if is_reversed else 1
    print(s[::step])
    is_reversed = not is_reversed
    i += 1
    f(s, i, max_i, is_reversed)

f('', 1, 10, False)

这些看起来越来越奇怪的代码片段的结果:

1
21
123
4321
12345
654321
1234567
87654321
123456789

答案 4 :(得分:1)

您可以使用简单的递归:

def barChart(numbers):
    for i in numbers:
        for z in range(i):
            print("#")

输出:

function random_image($path)
{
    // returning dummmy image
    return "https://images.unsplash.com/photo-1535498730771-e735b998cd64?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=623ed05afcc5a3fa1e444ffca95854dc&w=1000&q=80";
}

echo "<a href='".random_image('css/avatars')."' target='_blank'> <img src='".random_image('css/avatars')."' /></a>";