Решить задачу через рекурсию
На ввод поступает число n, задача построить матрицу nxn и заполнить её значениями от 1 до nxn закручеными по спирали. Через циклы решил, в коментах было сказано что можно решить через рекурсию, но решение не было приложено. Кто шарит, поделитесь опытом=)
a,j,i,n,c,t,d,y=int(input()),0,0,0,0,-1,2,0
b=[[0 for j in range(a)] for i in range(a)]
while n<a*a:
for i in range(c,len(b)-y):
b[j][i]+=1+n
n+=1
c+=1
for j in range(c,len(b)-y):
b[j][i]+=1+n
n+=1
y+=1
for i in range(len(b)-d,t,-1):
b[j][i]+=1+n
n+=1
t+=1
for j in range(len(b)-d,t,-1):
b[j][i]+=1+n
n+=1
d+=1
for i in range(len(b)):
print(*b[i])
Ответы (2 шт):
Через сложную рекурсию можно. Определяете 4 рекурсивные функции по всем направлениям (инкремент/декремент i и j по направлению спирали).
Допустим с первой ячейки заполнять начинаем строку. Значит первой будет вызываться функция которая будет инкриминировать j и рекурсивно вызываться до тех пор, пока j + 1 < n и пока a[i][j+1] = 0 (при условии, что массив изначально заполнен нулями).
Как только условие не выполняется, меняем направление в нужную сторону для продолжения спирали (вызываем следующую рекурсивную функцию, которая будет менять индексы нужным образом)
Условием выхода из рекурсии будет достижение n*n числа.
n = 10
matrix = [[None] * n for _ in range(n)]
dirs = [
lambda x, y: (x + 1, y),
lambda x, y: (x, y + 1),
lambda x, y: (x - 1, y),
lambda x, y: (x, y - 1),
]
def fill_m(x0, y0, value, n, dir):
matrix[x0][y0] = value
x, y = dirs[dir](x0, y0)
if x < 0 or x >= n or y < 0 or y >= n or matrix[x][y] is not None:
dir = 0 if dir == 3 else dir + 1
x, y = dirs[dir](x0, y0)
if matrix[x][y] is not None:
return
fill_m(x, y, value + 1, n, dir)
fill_m(0, 0, 0, n, 0)
print(*matrix, sep='\n')