Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 2
1

Работа рекурсии Python3

09.09.2018, 12:07. Показов 1699. Ответов 2

Author24 — интернет-сервис помощи студентам
В программе по вычислению определителя матрицы использую рекурсивный алгоритм.

Если вкратце, то в функции determinant программа почему-то запоминает временное значение определителя, вследствие чего и выдаёт ошибку выхода за рамки массива. По-идее, в последних сообщениях, которые выводятся перед тем, как происходит ошибка, должно быть указано:
Python
1
2
3
Matrix: 
[1,2]
[3,4]
Но вместо этого получаем временное значение:

Python
1
2
Matrix:
[4]
В чём же ошибка?
Исходник кода:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
def createMatrix():
    global size
    a = []
    for t in range(size):
        a.append([])
        for k in range(size):
            a[t].append(0)
    print("Введите элементы матрицы")
    for t in range(size):
        for k in range(size):
            a[t][k] = int(input())
 
    return a
 
 
def printMatrix(Matrix):
    for a in Matrix:
        print(a)
 
 
def newMatrix(Matrix,j):
    print("old matrix:")
    printMatrix(Matrix)
    del Matrix[0]
    for t in range(len(Matrix)):
        for k in range(len(Matrix[t])):
            if k == j:
                del Matrix[t][k]
    print("new matrix:")
    printMatrix(Matrix)
    return Matrix
 
 
def determinant(Matrix):
    print("Matrix to determinate:")
    printMatrix(Matrix)
    print('size = ',len(Matrix),' x ',len(Matrix[0]))
    if (len(Matrix) == 1 and len(Matrix[0]) == 1):
        print("True")
        print("Matrix[0][0] = ", Matrix[0][0])
        return Matrix[0][0]
    else:
        det = 0
        for j in range(len(Matrix)):
            print("j = ",j)
            print("Matrix: ")
            printMatrix(Matrix)
            det += ((-1)**(1+j+1))*Matrix[0][j]*determinant(newMatrix(Matrix,j))
            print("det = ",det)
        return det
 
size = int(input("Введите размер матрицы \n"))
a = createMatrix()
D = determinant(a)
Вывод в консоль полностью:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Введите размер матрицы 
2
Введите элементы матрицы
1
2
3
4
Matrix to determinate:
[1, 2]
[3, 4]
size =  2  x  2
j =  0
Matrix: 
[1, 2]
[3, 4]
old matrix:
[1, 2]
[3, 4]
new matrix:
[4]
Matrix to determinate:
[4]
size =  1  x  1
True
Matrix[0][0] =  4
det =  4
j =  1
Matrix: 
[4]
Traceback (most recent call last):
  File "tests.py", line 54, in <module>
    D = determinant(a)
  File "tests.py", line 48, in determinant
    det += ((-1)**(1+j+1))*Matrix[0][j]*determinant(newMatrix(Matrix,j))
IndexError: list index out of range
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2018, 12:07
Ответы с готовыми решениями:

Python3 работа с файлами
#!/user/bin/python # -*- coding^ utf-8 -*- import numpy as np from math import * def...

Python3 работа с mySQL
Пробы пера... Пишу обработчик информации. Необходима помощь по работе с базой данных. ...

В терминале есть установленная версия Python3 а в списке приложений Python3 нет на Debian
Как сделать так что б в списке приложений то же был Python3 на Debian

Импорт python3-библиотек в python3.7
Здравствуйте! Такая проблема - не могу имортировать либы 3 питона внутри 3.7 версии. Сижу на...

неправильная работа рекурсии в некоторых случаях
Неправильно работает рекурсия для некоторых чисел(умножение Карацубы), подскажите пожалуйста как...

2
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
09.09.2018, 13:28 2
Можно внятнее как-то?
Что должна делать функция newMatrix?
0
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
16.09.2018, 04:47 3
TooBad, Вы делаете довольно типичную ошибку: смело модифицируете список, переданный в процедуру. Список - это объект, передаётся в процедуру по ссылке, поэтому все изменения остаются навсегда
0
16.09.2018, 04:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2018, 04:47
Помогаю со студенческими работами здесь

Работа функции рекурсии при различной записи выражения
Почему программа работает корректно только если написано (val-1); если (val--) происходит...

Вычисление числа а в степени b с использованием рекурсии и без использования рекурсии
Реализуйте приложение, которое будет производить вычисление по формулам двумя способами: с...

Вывести на экран результат возведения в степень числа с помощью рекурсии, подсчитать уровень рекурсии.
Задание: Вывести на экран результат возведения в степень числа с помощью рекурсии, подсчитать...

Python3 и lxml
Форумчане, решил перейти на третий питон и сразу же столкнулся с проблемой. Все библиотеки...

Pickle Python3
Добрый вечер. Задача следующая. Я записываю в файл с помощью pickle.dump() несколько строк. Мне...

Python3 + Winapi
Здравствуйте. Очень нужна помощь. А именно в работе с буфером обмена. Я не могу понять как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru