Вопросы с тегом «tail-recursion»

Хвостовая рекурсия - это рекурсивная стратегия, при которой функция выполняет некоторую работу, а затем вызывает себя. «Хвост» относится к тому факту, что рекурсия находится в самом конце функции. Многие - особенно функциональные - компиляторы языков программирования могут превращать эти типы вызовов в итерацию, что означает, что хвостовая рекурсия в поддерживаемых языках может использоваться, не опасаясь переполнения стека, независимо от количества вызовов.

276
Как мне выйти из цикла в Scala?

Как мне разорвать петлю? var largest=0 for(i<-999 to 1 by -1) { for (j<-i to 1 by -1) { val product=i*j if (largest>product) // I want to break out here else if(product.toString.equals(product.toString.reverse)) largest=largest max product } } Как превратить вложенные циклы в хвостовую...

225
Понимание рекурсии [закрыто]

В настоящее время этот вопрос не очень подходит для нашего формата вопросов и ответов. Мы ожидаем, что ответы будут подтверждены фактами, ссылками или опытом, но этот вопрос, скорее всего, вызовет дебаты, споры, опрос или расширенное обсуждение. Если вы считаете, что этот вопрос можно улучшить и,...

206
Оптимизирует ли Python хвостовую рекурсию?

У меня есть следующий кусок кода, который завершается с ошибкой: RuntimeError: превышена максимальная глубина рекурсии Я попытался переписать это, чтобы учесть оптимизацию хвостовой рекурсии (TCO). Я считаю, что этот код должен был быть успешным, если бы имелась ТШО. def trisum(n, csum): if n == 0:...

150
Какие компиляторы C ++, если таковые имеются, выполняют оптимизацию хвостовой рекурсии?

Мне кажется, что было бы идеально работать для оптимизации хвостовой рекурсии как в C, так и в C ++, но при отладке я никогда не вижу стека фреймов, который указывает на эту оптимизацию. Это хорошо, потому что стек говорит мне, насколько глубока рекурсия. Тем не менее, оптимизация тоже была бы...

121
Как именно работает хвостовая рекурсия?

Я почти понимаю, как работает хвостовая рекурсия и чем она отличается от обычной. Я только не понимаю, почему не требуется, чтобы стек запомнил свой адрес возврата. // tail recursion int fac_times (int n, int acc) { if (n == 0) return acc; else return fac_times(n - 1, acc * n); } int factorial (int...

111
Почему .NET / C # не оптимизирован для рекурсии хвостового вызова?

Я нашел этот вопрос о том, какие языки оптимизируют хвостовую рекурсию. Почему C # по возможности не оптимизирует хвостовую рекурсию? В конкретном случае, почему этот метод не оптимизирован для создания цикла ( 32-разрядная версия Visual Studio 2008 , если это имеет значение) ?: private static void...

99
Предотвращает ли JVM оптимизацию хвостового вызова?

Я видел эту цитату на вопрос: какой хороший функциональный язык для создания веб-службы? Scala, в частности, не поддерживает исключение хвостовых вызовов, за исключением саморекурсивных функций, что ограничивает виды композиции, которую вы можете выполнять (это фундаментальное ограничение JVM)....

92
Выполняет ли Ruby оптимизацию хвостового вызова?

Функциональные языки приводят к использованию рекурсии для решения множества проблем, поэтому многие из них выполняют оптимизацию хвостового вызова (TCO). TCO вызывает вызовы функции из другой функции (или самой функции, в этом случае эта функция также известна как Tail Recursion Elimination,...

91
Оптимизированы ли какие-либо хвостовые вызовы движков JavaScript (TCO)?

У меня есть хвостовой рекурсивный алгоритм поиска пути, который я реализовал в JavaScript, и я хотел бы знать, могут ли какие-либо (все?) Браузеры получить исключения переполнения стека....

90
Есть ли в Haskell хвостовая рекурсивная оптимизация?

Сегодня я обнаружил команду time в unix и подумал, что буду использовать ее, чтобы проверить разницу во времени выполнения между хвостовой рекурсивной и нормальной рекурсивной функцией в Haskell. Я написал следующие функции: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1...

13
Как рассуждать о безопасности стека в Scala Cats / fs2?

Вот фрагмент кода из документации для fs2 . Функция goрекурсивная. Вопрос в том, как узнать, безопасен ли он для стека, и как определить, является ли какая-либо функция безопасной для стека? import fs2._ // import fs2._ def tk[F[_],O](n: Long): Pipe[F,O,O] = { def go(s: Stream[F,O], n: Long):...