Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13

Рекурсия: MemoryError: Stack overflow

22.01.2021, 14:14. Показов 3819. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

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
from memory_profiler import profile
import timeit
import math
import sys
 
print(sys.getrecursionlimit())
sys.setrecursionlimit(10000)
print(sys.getrecursionlimit())
 
 
def timer(function):
    def new_function(*args, **kwargs):
        start_time = timeit.default_timer()
        ret = function(*args, **kwargs)
        elapsed = timeit.default_timer() - start_time
        print(f'Время выполнения функции: {elapsed:.04f}')
        return ret
    return new_function
 
 
num = 5000
 
 
@timer
@profile
def recursion(n):
    def factorial(x):
        if x == 1:
            return x
        else:
            return x * factorial(x - 1)
 
    print(f'Факториал числа {num}: {factorial(n)}')
 
 
@timer
@profile
def for_factorial(n):
    fact = 1
    for i in range(2, n+1):
        fact *= i
    print(f'Факториал числа {n}: {fact}')
 
 
@timer
@profile
def math_factorial(n):
    fact = math.factorial(n)
    print(f'Факториал числа {n}: {fact}')
 
 
recursion(num)
for_factorial(num)
math_factorial(num)
Почему работает только при 4000 итераций?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2021, 14:14
Ответы с готовыми решениями:

MemoryError
здравствуйте, получаю ошибку MemoryError=Ошибка памяти на строке strings1 = strings1.replace(val.replace('~', ''), '<SPAN...

memoryerror python
здравствуйте, получаю ошибку memoryerror, что это такое, читал - где-то напряг машину, возникает ошибка на строке s1 =...

MemoryError при заполнении list
Задание Over The Road, в нем нужно вернуть адрес дома на противоположной улице, адреса вот так располагаются: 1| |6 3| |4 5| |2...

15
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,180
Записей в блоге: 6
22.01.2021, 14:42
"Memoryerror" кагбэ намекает, что у вас слишком большие аппетиты.
0
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
22.01.2021, 14:47  [ТС]
Так вроде бы указал:
Цитата Сообщение от SW Developer Посмотреть сообщение
sys.setrecursionlimit(10000)
16 Gb RAM мало?
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,180
Записей в блоге: 6
22.01.2021, 16:03
SW Developer,
Тут же не накладные расходы на рекурсию, а запрос памяти внутри самой процедуры. А факториал растёт очень быстро. Так что вполне возможно.
0
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
22.01.2021, 17:21  [ТС]
dondublon, что-то не сходится. При глубине рекурсии 1000 объем памяти занимает 16.7 MiB, при 4000 - 19.6 MiB. Хотите сказать, что при 10000 не хватит 16 Гигабайт?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.01.2021, 17:50
Python выбрасывает MemoryError заранее - когда понимает, что ее ему не хватит.
Чему вы удивляетесь?
Длинная арифметика в Python встроенная, но, увы, неэффективная, в сравнении с компилируемыми языками.
Сколько будет цифр в факториале 5000? Больше 16 тыс. А теперь представьте сколько таких чиселок ему приходится держать в памяти на каждый ход рекурсии...
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,180
Записей в блоге: 6
22.01.2021, 17:57
SW Developer, я бы на вашем месте попробовал построить график, для начала - по тысяче, при приближении к порогу (на котром вываливается) - поточнее. Факториал растёт очень быстро.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
22.01.2021, 18:27
Цитата Сообщение от SW Developer Посмотреть сообщение
sys.setrecursionlimit(10000)
Поставьте больше лимит - у вас переполняется стек вызовов функций.
0
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
22.01.2021, 19:07  [ТС]
Garry Galler,
Цитата Сообщение от Garry Galler Посмотреть сообщение
Сколько будет цифр в факториале 5000? Больше 16 тыс.
думаю, что намного-намного больше, если верить Википедии.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.01.2021, 19:18
Цитата Сообщение от SW Developer Посмотреть сообщение
думаю, что намного-намного больше,
Python
1
2
3
>>> len(str(math.factorial(5000)))
16326
>>>
1
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
22.01.2021, 19:33  [ТС]
Arsegg,
Цитата Сообщение от Arsegg Посмотреть сообщение
Поставьте больше лимит - у вас переполняется стек вызовов функций.
Это не работает, результат такой же - 4000!.

Добавлено через 4 минуты
Garry Galler,
Цитата Сообщение от Garry Galler Посмотреть сообщение
Python
1
2
3
>>> len(str(math.factorial(5000)))
16326
>>>
не правильно вас понял.)

Какой диапазон типа INT?

Добавлено через 8 минут
dondublon,
Цитата Сообщение от dondublon Посмотреть сообщение
SW Developer, я бы на вашем месте попробовал построить график
, график зависимости N от
Python
1
len(str(math.factorial(N)))
?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.01.2021, 19:41
Цитата Сообщение от SW Developer Посмотреть сообщение
Какой диапазон типа INT?
Размер ОЗУ вашего компьютера. У Python нет размерности числовых типов и нет деления на short, long и long long.
И в Python крайне опрометчиво что-то вычислять рекурсией: в других ЯП вы бы получили цикл вместо рекурсии (хвостовая оптимизация). В Python ее нет. По историческим причинам и личной неприязни Гвидо к рекурсии.
1
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,180
Записей в блоге: 6
24.01.2021, 21:33
SW Developer, график используемой памяти в зависимости от N (аргумент факториала). Явно где-то между 5000 и 4000 критическое значение. Надо посмотреть, как ведёт себя память вблизи.
0
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
25.01.2021, 11:24  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
график используемой памяти в зависимости от N (аргумент факториала)
dondublon, не подскажите, где копать, чтобы создать такую зависимость?
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,180
Записей в блоге: 6
25.01.2021, 11:36
SW Developer, быстрее вручную, чем огород городить. Бисекцией.
4000 работает, 5000 вылетает - значит, считаем 4500. Падает - значит, 4250, не падает - 4750.
Как найдёте падучую границу - хоть три значения до неё посмотрите, убедиться, что взлетает.
1
 Аватар для SW Developer
97 / 93 / 81
Регистрация: 10.01.2016
Сообщений: 663
Записей в блоге: 13
25.01.2021, 11:56  [ТС]
dondublon, понятно, бинарный поиск.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2021, 11:56
Помогаю со студенческими работами здесь

MemoryError при заполнении массива
Добрый день, столкнулся с MemoryError при заполнении массива данными. Действительно, получается очень большое количество, однако это...

s_push parser stack overflow
Приветствую! Есть следующий код: print...

DBSCAN MemoryError
Задача пропарсить лог запросов поисковика объемом в 500 метров и выделить запросы, связанные с просмотром телевидения. Решать решил в...

Stack overflow!
Привет всем! если кто знает, как побороть ошибку "stack overflow"? пишу: procedure TDataModule1.cdsPrihSlaveCalcFields(DataSet:...

stack overflow in C++
#include<iostream> #include<cmath> using namespace std; int main() { int n,i,n1,j,a1,b1; double n2; bool a; bool b; ...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru