Есть ли обходной путь для ошибок переполнения стека в рекурсивных функциях в Ruby?Есть ли обходной путь для ошибок «слишком высокий уровень стека» в рекурсивных подпрограммах?
Скажем, к примеру, у меня есть этот блок:
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end
, если я называю countUpTo(1, 10000)
, я получаю сообщение об ошибке: stack level too deep (SystemStackError)
.
Похоже, он разбивается на 8187. Есть ли какая-то функция, которую я могу назвать, говоря Ruby, чтобы игнорировать размер стеков или способ увеличить максимальный размер стека?
Не делайте этого. Если вы намеренно повторяете 10 000 раз, вы делаете это ужасно неправильно и злоупотребляете рекурсией. – meagar
Реализации Ruby не обязательно устраняют удаление хвоста, поэтому вы полагаетесь на использование размера стека C. Одна из возможностей заключается в том, что вы можете переписать свою функцию как итеративную. – birryree
Во-первых, мой собственный опыт работы с Ruby заключается в том, что он не особенно хорош в рекурсии, поскольку он создает ошибки, подобные этому, довольно легко и медленнее (чем вам хотелось бы). Кроме того, чтобы получить лучшую производительность в этой области, вам нужно скомпилировать Ruby с определенным набором констант, но я не нашел, что это очень помогло. Другими словами, напишите свою функцию по-другому, используя обычные методы Ruby, такие как 'times',' upto' и т. Д. @meagar, если вы не знаете, в чем цель, я не думаю, что вы можете сделать это утверждение. Я написал методы в Haskell, которые решают, что количество раз не проблема, и это дежурство. – iain