Решить задачу через рекурсию

На ввод поступает число 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 шт):

Автор решения: Uporka

Через сложную рекурсию можно. Определяете 4 рекурсивные функции по всем направлениям (инкремент/декремент i и j по направлению спирали).

Допустим с первой ячейки заполнять начинаем строку. Значит первой будет вызываться функция которая будет инкриминировать j и рекурсивно вызываться до тех пор, пока j + 1 < n и пока a[i][j+1] = 0 (при условии, что массив изначально заполнен нулями).

Как только условие не выполняется, меняем направление в нужную сторону для продолжения спирали (вызываем следующую рекурсивную функцию, которая будет менять индексы нужным образом)

Условием выхода из рекурсии будет достижение n*n числа.

→ Ссылка
Автор решения: Zhihar
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')
→ Ссылка