我试图解决一个简单的问题,我要做的是,
如果n
的值为2
,则打印
2211
21
或者如果n
的值为3
,则打印
333222111
332211
321
我编码的是这个
n=3
for i in range(n,0,-1):
for j in range(n,0,-1):
print(str(j)*i,sep='',end='')
print()
没有两个循环就可以执行此任务吗?
或者,我可以在不使用循环的情况下将j
的值从n
迭代到0
并打印每个变化吗?
答案 0 :(得分:3)
您可以使用递归来做到这一点,但是时间复杂度不会改变……类似这样的东西:
def method(n, size):
if n == 0:
return;
for i in range(size,0,-1):
print(str(i)*n,sep='',end='')
print()
method(n-1, size)
method(3, 3)
答案 1 :(得分:1)
不,实际上没有一种方法可以执行一个循环,因为该任务涉及一个双循环,但是您可以使其效率更高,例如,使用列表理解来构建每一行,因此您仅调用{{ 1}}每行一次。
您可以使用递归,但是效率较低,它并没有真正消除循环,只是以不同的方式实现了循环。
这是代码的列表压缩版本,包装在函数中。
print
FWIW,这是一种单线版本,效率稍高一些,但是时间复杂度当然仍然是O(n²)。而且我认为您会同意阅读起来有点困难。 ;)
def show_pattern(n):
for i in range(n, 0, -1):
print(''.join([str(j)*i for j in range(n, 0, -1)]))
一个人可能会说复杂度实际上是O(n³),因为print('\n'.join([''.join([str(j)*i for j in range(n, 0, -1)]) for i in range(n, 0, -1)]))
是由一个循环在内部执行的,但是该循环以C速度运行,因此我们可以假设它是原始操作。