我必须按照以下规则打印数字金字塔:
奇数索引: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
我是递归的初学者,我也很高兴为您提供解释。 谢谢。
答案 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>";