如果输入的矩阵是魔术方而不使用numpy

时间:2016-11-09 03:24:03

标签: python python-3.x matrix

我有两个功能,一个在下面:

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的方法,那就太棒了。

2 个答案:

答案 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)

代码明显错误:

  1. 如果通过所有测试,则不会返回True
  2. 你在循环中检查你的总数,而不是在它之后(显然你直到之后才进行求和)。
  3. 你完全无视输入!初始循环只是一个满0的正方形,你可以测试你的总和。显然,你总是会为你的总数获得0。
  4. 我建议你开始做一些调试 - 把一些' print'功能中的陈述,看看发生了什么。你几乎就在那里,我很确定你可以自己去那里。这里不需要numpy。

    编辑:

    1. 如果它不是假的话,你确定要在第一个循环后返回True吗?好像你只是在这里测试了对角线。请注意,如果不是的话,你永远不会先通过!考虑True是否正确 - 所有测试都通过。
    2. x未在您的编辑中定义!
    3. 即使它是,这个square[i][x-1-i]是什么?试着考虑一下你要做的事情。对列进行求和将在同一个第一个索引[i][0,1,2...]上进行,并且列与第二个索引[0,1,2...][i]相同。
    4. 你真的需要阅读代码 - 这里是一个方形的例子:http://www.codeproject.com/Articles/4952/Magic-Square,你需要熟悉python - 例如,内置了一个sum函数。挑战自己!