我有两个功能,一个在下面:
def is_square(m):
for i in range(len(m)):
if len(m[i]) != len(m):
return False
return True
如果m是方阵,则返回True,否则返回False。问题不在于这个,它与第二个功能有关。
第二个功能:
def magic(m):
if(not(is_square(m))):
return False
# Here's where code starts.
这就是我的尝试。编辑:我的反馈后的第二次尝试。
square = []
for i in range(len(m)):
square.append([])
for j in range(len(m)):
square[i].append(0)
total = 0
for i in range(len(m)-1):
total += square[i][i]
if total != x*(x*x+1)/2:
return False
else:
return True
total = 0;
for i in range(x):
total += square[i][x-1-i]
if total != x*(x*x+1)/2:
return False
else:
return True
以下是此功能的预期结果:
# this should print True
m0=[[2,7, 6],[9,5,1],[4,3,8]]
print(magic(m0))
# this should print True
m1 = [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
print(magic(m1))
# this should print False.
m2 = [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
print(magic(m2))
#this should print False.
m3 = [[1,1],[1,1]]
print(magic(m3))
#this should print False.
m3 = [[1,1],[1,1],[1,2]]
print(magic(m3))
顺便说一下,我很难安装numpy,所以如果还有其他没有import numpy的方法,那就太棒了。
答案 0 :(得分:0)
原始代码中似乎存在一些错误。主要与for循环有关,并确保它们在正确的位置启动和停止(由python中的缩进控制)。
此外,您正在测试数字的完全相等性,在示例中,当您处理整数时,这可能是安全的,但可能是一个问题,因为数字不能完全表示为浮点数。
例如,键入1.1*3 == 3.3
会在python中返回False
。
我已使用math.isclose()
模块中的math
测试替换了您的相等测试(我认为这仅适用于python 3,但不确定)。
我还添加了测试,以检查所有行和列是否按要求添加:
import math
def is_square(m):
for i in range(len(m)):
if len(m[i]) != len(m):
return False
return True
def magic(m):
if(not(is_square(m))):
return False
total = 0
x = len(m)
for i in range(x):
total += m[i][i]
if not(math.isclose(total, x*(x*x+1)/2)):
return False
total = 0
for i in range(x):
total += m[i][x-1-i]
if not(math.isclose(total, x*(x*x+1)/2)):
return False
# Check rows all add-up
for i in range(x):
total = 0
for j in range(x):
total += m[i][j]
if not(math.isclose(total, x*(x*x+1)/2)):
return False
# Check cols all add-up
for i in range(x):
total = 0
for j in range(x):
total += m[j][i]
if not(math.isclose(total, x*(x*x+1)/2)):
return False
return True
# this should print True
m0=[[2,7,6],[9,5,1],[4,3,8]]
print(magic(m0))
# this should print True
m1 = [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
print(magic(m1))
# this should print False.
m2 = [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
print(magic(m2))
#this should print False.
m3 = [[1,1],[1,1]]
print(magic(m3))
#this should print False.
m4 = [[1,1],[1,1],[1,2]]
print(magic(m4))
返回:
True
True
False
False
False
答案 1 :(得分:0)
代码明显错误:
我建议你开始做一些调试 - 把一些' print'功能中的陈述,看看发生了什么。你几乎就在那里,我很确定你可以自己去那里。这里不需要numpy。
编辑:
True
是否正确 - 所有测试都通过。x
未在您的编辑中定义!square[i][x-1-i]
是什么?试着考虑一下你要做的事情。对列进行求和将在同一个第一个索引[i][0,1,2...]
上进行,并且列与第二个索引[0,1,2...][i]
相同。你真的需要阅读代码 - 这里是一个方形的例子:http://www.codeproject.com/Articles/4952/Magic-Square,你需要熟悉python - 例如,内置了一个sum函数。挑战自己!