Сложность в реализации алгоритма Штрассена в Python

Я не понимаю, как вызвать мой код рекурсивно. Вот мой код до сих пор:

import numpy

B = [[5,5,5,5,5,5,5,5],[6,6,6,6,6,6,6,6],[7,7,7,7,7,7,7,7],[8,8,8,8,8,8,8,8],
 [9,9,9,9,9,9,9,9], [10,10,10,10,10,10,10,10],[11,11,11,11,11,11,11,11],       [12,12,12,12,12,12,12,12]]

A = [[5,5,5,5,5,5,5,5],[6,6,6,6,6,6,6,6],[7,7,7,7,7,7,7,7],[8,8,8,8,8,8,8,8],
 [1,1,1,1,1,1,1,1], [2,2,2,2,2,2,2,2],[3,3,3,3,3,3,3,3],[4,4,4,4,4,4,4,4]]

def main():
   strassen(A,B)

def strassen(A, B):
    A = numpy.asarray(A)
    B = numpy.asarray(B)
    lengthA = len(A)
    lengthB = len(B)
    if lengthA == 2:
        print "will calculate"
    else:       
        a, b = strassen(A[:lengthA//2, :lengthA//2], B[:lengthB//2, :lengthB//2])

        lengthA = lengthA//2
        lengthB = lengthB//2
        print a
        print b
        return a, b

Я пытаюсь уменьшить a в [[5,5],[6,6]] а также b в [[5,5],[6,6]] но я получаю ошибку:

a, b = strassen(A[:lengthA//2, :lengthA//2], B[:lengthB//2, :lengthB//2])
TypeError: 'NoneType' object is not iterable. 

a а также b являются 1-ыми матрицами 2x2, которые будут сформированы после 2-го целого матричного деления для A и B. Пожалуйста, кто-нибудь может объяснить это мне. Спасибо

1 ответ

У вас нет возвращаемого значения в вашем состоянии завершения рекурсии. Когда я запускаю ваш код, он печатает "вычислит" перед тем, как выдать ошибку. Ошибка происходит после этого, потому что нет никакого возвращаемого значения из функции strassen при последнем вызове (когда lengthA == 2).

Другие вопросы по тегам