你就快到了。当计数器c等于n*n时,就会进入一个无限循环。for循环中的所有范围都将变为空,c = c + 1将不再执行。在
您需要将检查改为c < (n*n)和范围:import numpy as np
n = 4
M = np.zeros([n, n])
init = 0
nlimit = n - 1
c = 0
if (n % 2 == 0):
while (c < (n*n)):
for i in range(init, nlimit, 1):
c = c + 1
M[nlimit, i] = c
for i in range(nlimit, init, -1):
c = c + 1
M[i, nlimit] = c
for i in range(nlimit, init, -1):
c = c + 1
M[init, i] = c
for i in range(init, nlimit, 1):
c = c + 1
M[i, init] = c
init = init + 1
nlimit = nlimit - 1
print(M)
It输出:
^{pr2}$
作为奖励,你不需要为奇数改变太多。对于n=5,它输出:[[ 13. 12. 11. 10. 9.]
[ 14. 23. 22. 21. 8.]
[ 15. 24. 0. 20. 7.]
[ 16. 17. 18. 19. 6.]
[ 1. 2. 3. 4. 5.]]
您只需更改while c并在中间添加最后一个数字:import numpy as np
n = 5
M = np.zeros([n, n])
init = 0
nlimit = n - 1
c = 0
while c < (n * n) - 1:
for i in range(init, nlimit, 1):
c = c + 1
M[nlimit, i] = c
for i in range(nlimit, init, -1):
c = c + 1
M[i, nlimit] = c
for i in range(nlimit, init, -1):
c = c + 1
M[init, i] = c
for i in range(init, nlimit, 1):
c = c + 1
M[i, init] = c
init = init + 1
nlimit = nlimit - 1
M[(n - 1) // 2, (n - 1) // 2] = n * n
print(M)
它现在输出:[[ 13. 12. 11. 10. 9.]
[ 14. 23. 22. 21. 8.]
[ 15. 24. 25. 20. 7.]
[ 16. 17. 18. 19. 6.]
[ 1. 2. 3. 4. 5.]]