Как я указал в своем комментарии, диагональные матрицы имеют только квадратные матрицы. Но даже для них все «немного» сложнее, чем кажется:
- Я мог бы сделать это за один цикл, но я думаю, что лучше увидеть все "разделы"
- Также добавлен рекурсивный вариант (не используется). Я предпочитаю этот, так как он понятнее, особенно учитывая природу проблемы, рекурсия не идет так глубоко, чтобы генерировать StackOverflow или негативно влиять на производительность
code.py
#!/usr/bin/env python3
import sys
def print_square_frame(side, char="*"):
print(char * side) # Upper row
if side == 1:
return
for i in range(side // 2 - 1):
print(char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char)
if side % 2:
print(char + " " * ((side - 3) // 2) + char + " " * ((side - 3) // 2) + char) # Mid row
for i in range(side // 2 - 2, -1, -1):
print(char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char)
print(char * side) # Lower row
# Recursion
def _print_square_frame_rec(side, char, i):
if i == side // 2 - 1:
if side % 2 :
print(char + " " * ((side - 3) // 2) + char + " " * ((side - 3) // 2) + char) # Mid row
return
else:
s = char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char
print(s)
_print_square_frame_rec(side, char, i + 1)
print(s)
def print_square_frame_rec(side, char="*"):
print(char * side)
if side == 1:
return
_print_square_frame_rec(side, char, 0)
print(char * side)
# Recursion end
def main(argv):
dim = 10
if argv:
if argv[0].isdigit():
dim = int(argv[0])
print_square_frame(dim)
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main(sys.argv[1:])
выход
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055342983]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
**********
** **
* * * *
* * * *
* ** *
* ** *
* * * *
* * * *
** **
**********
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055342983]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py 7
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32
*******
** **
* * * *
* * *
* * * *
** **
*******