Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 13, 2010 06:50:20

mtt
От:
Зарегистрирован: 2010-10-11
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

Просто в поиск просьба не посылать, я искал

Суть: есть дерево, 50к вершин, нужно от вывода предков относительно корня r1 перейти к выводу предков r2. Задача простая, но я решил написать поиск в глубину, и с ним проблемы.

from sys import stdout
import sys
def dfs(x,parent):
res[x]=parent
for i in a[x]:
if res[i]==-1:
dfs(i,x)
#print (x,parent)
return

sys.setrecursionlimit(50000)

f=open('C://input.txt','r')
#(n,r1,r2)=map(int,raw_input().split())
#parent=map(int,raw_input().split())

(n,r1,r2)=map(int,str(f.readline()).split())
parent=map(int,str(f.readline()).split())

a=map(apply,[list]*(n+1))
for i in xrange(n-1):
j=i+1
if r1<=j:
j+=1
#(Это список смежности)
a[j]+=[parent[i]]
a[parent[i]]+=[j]

res=[-1]*(n+1)
dfs(r2,0)
for i in res:
if i>0:
stdout.write(str(i)+' ')
Вчера программа погибала на моем компьютере с ошибкой что-то вроде memory limit, теперь просто молча выключается после посещения около 19 тысяч вершин из 50, так ничего и не выведя.
Забыл добавить, на паскале это отлично работает.



Отредактировано (Окт. 13, 2010 06:57:16)

Офлайн

#2 Окт. 13, 2010 22:07:05

mtt
От:
Зарегистрирован: 2010-10-11
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

Ладно, переформулирую проще: почему этот код падает без ошибки, выводя в консоль последнее число 9567 и как это исправить?(я имею в виду, управлять кол-вом итераций до падения)

import sys
def rec(count):
print count
rec(count+1)

sys.setrecursionlimit(30000)
rec(1)



Отредактировано (Окт. 13, 2010 22:07:53)

Офлайн

#3 Окт. 13, 2010 22:44:54

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

попробуй увеличить глубину рекурсии или переписать алгоритм итерационно :)
http://docs.python.org/library/sys.html#sys.setrecursionlimit



Офлайн

#4 Окт. 13, 2010 22:50:55

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Проблемы с рекурсией

Пробовал запустить на stackless python 2.6.5, тот отрабатывает до 30000.
А в обычном видимо стек ограничен неким значением не позволяющим выполнить такое(>9567) количество вызовов. Возможно если сократить количество передаваемых параметров(count сделать глобальной), количество итераций увеличится.



Отредактировано (Окт. 13, 2010 22:51:41)

Офлайн

#5 Окт. 13, 2010 23:25:12

mtt
От:
Зарегистрирован: 2010-10-11
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

Zubchick
попробуй увеличить глубину рекурсии или переписать алгоритм итерационно smile
Спасибо конечно, но я уже увеличил глубину рекурсии, а итерационное переписывание всех алгоритмов не выход.

truporez
А в обычном видимо стек ограничен неким значением не позволяющим выполнить такое(>9567) количество вызовов. Возможно если сократить количество передаваемых параметров(count сделать глобальной), количество итераций увеличится.
А можно сам стек увеличить? Что-то это не гуглится, только модуль никсовый нашел(resource)



Офлайн

#6 Окт. 14, 2010 01:20:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Проблемы с рекурсией

mtt, а какая у вас операционка? Помимо питоновского стека есть еще и стек потока. На него тоже существует ограничение.
На моей убунте ваш примерчик честно отработал до конца.



Офлайн

#7 Окт. 14, 2010 07:02:19

mtt
От:
Зарегистрирован: 2010-10-11
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

Windows xp, python idle 2.7, скачанный c http://www.python.org/download/ . Проверял на другой машине с виндой, то же самое.



Офлайн

#8 Окт. 14, 2010 07:28:42

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Проблемы с рекурсией

С Виндой - да, печально. Стек в 2 мегабайта.
Чинится, но не очень легко. Microsoft Visual Studio 2008 есть?



Отредактировано (Окт. 14, 2010 07:33:03)

Офлайн

#9 Окт. 14, 2010 15:37:04

mtt
От:
Зарегистрирован: 2010-10-11
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

Установлю, если нужно.



Офлайн

#10 Окт. 14, 2010 16:11:24

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Проблемы с рекурсией

Андрей Светлов
mtt, а какая у вас операционка? Помимо питоновского стека есть еще и стек потока. На него тоже существует ограничение.
На моей убунте ваш примерчик честно отработал до конца.
linux 32bit, python 2.6.6, тоже отработал до конца

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version