По-моему, легче не циклом, а сделать функцию

, возвращающую число, которое стоит на месте

в матрице

. Например (не самое лучшее решение, но простое):
Код:
(* Направление к элементу, к которому нужно перейти при рекурсии *)
dir[i_, j_, n_] := Piecewise[{
{{1, 0}, j < i && j < n + 1 - i},
{{-1, 0}, j > i - 1 && j > n + 1 - i},
{{0, -1}, j < n + 2 - i && j > i - 1},
{{0, 1}, True}}] // Append[#, n] &;
(* сама рекурсия *)
a[1, 1, n_] := 1;
a[i_, j_, n_] := 1 + Apply[a, {i, j, n} + dir[i, j, n]];
spiral[n_] := Array[a[#1, #2, 0] &, {n, n}] // Transpose;
-- 30 ноя 2010, 19:14 --У
Casaubon лучше.