作业问题:如何递归制作正方形

时间:2018-11-04 20:51:35

标签: python recursion

我有一个作业问题,要求做一个递归函数来生成边长为n的星号构成的正方形。

这是我应该如何实现功能: 您将在程序中实现两个函数:main()函数和generate_square()函数。主要功能应首先要求用户输入非零整数。后者应由main()函数使用适当的参数调用。然后,“ generate_square”函数应递归地生成指定大小的正方形(在python中用字符串列表表示,每个字符串以换行符结尾),然后将其返回给main()函数。然后,主要功能应向用户显示正方形。

这是我的代码。

def star(n):
    if n == 1:
        print('*' * n)
    if (n > 1):
        star(n - 1)

m = star(4)

我还没有向主体添加主要功能,因为我仍然必须修复其他功能。它只打印一个星号,而我希望它根据正方形的长度和宽度打印n个星号。

1 个答案:

答案 0 :(得分:0)

以非递归方式,可以很容易且更有效地做到这一点:

def generate_square(width):
    return ['*' * width for row in range(width)]

但是,整个递归标准使整个方法陷入困境,您确实必须以另一种方式来解决问题。尽管如此,我们仍可以利用程序实现来更好地理解问题。

使用以下内容:

for w in range(1,7):
    print(f'Square of width {w}: {generate_square(w)}')

我得到:

Square of width 1: ['*']
Square of width 2: ['**', '**']
Square of width 3: ['***', '***', '***']
Square of width 4: ['****', '****', '****', '****']
Square of width 5: ['*****', '*****', '*****', '*****', '*****']
Square of width 6: ['******', '******', '******', '******', '******', '******']

现在我可以开始考虑如何从前一个推导新的平方了。每次都将一个附加元素附加到上一个列表(与列表的任何其他元素相同),然后将每个元素与'*'串联。由此,我们可以创建一个通用的递归规范:

def generate_square(width):
    # to the previous list
    prev_square = generate_square(width - 1)
    # an additional element is appended ... (which is identical to any of the list's other elements)
    prev_square.append(prev_square[0])
    # and each element is concatenated with '*'
    prev_square = [row + '*' for row in prev_square]
    return prev_square

但是,它仍然缺少适当的递归函数的一个相当重要的元素:一个基本案例。我将把它作为练习留给读者。