我可以在不使用两个循环的情况下执行此任务吗?

时间:2018-10-02 11:56:59

标签: python python-3.x time-complexity

我试图解决一个简单的问题,我要做的是, 如果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并打印每个变化吗?

2 个答案:

答案 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速度运行,因此我们可以假设它是原始操作。