Запитання з тегом «tail-recursion»

Рекурсія хвоста - це рекурсивна стратегія, при якій функція виконує певний обсяг роботи, а потім викликає себе. "Хвіст" означає той факт, що рекурсія знаходиться в самому кінці функції. Багато - особливо функціональні - компілятори мов програмування можуть перетворити ці типи викликів на ітерацію, тобто рекурсію хвоста в підтримуваних мовах можна використовувати, не боячись переповнення стека, незалежно від кількості викликів.



19
Як мені вирватися з петлі у 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 } } Як перетворити вкладені петлі в хвостову рекурсію? З програми Scala Talk на FOSDEM 2009 …

20
Розуміння рекурсії [закрито]
Наразі це запитання не підходить для нашого формату запитань. Ми очікуємо, що відповіді будуть підкріплені фактами, посиланнями або експертними знаннями, але це питання, ймовірно, вимагатиме дискусій, аргументів, опитувань чи розширеної дискусії. Якщо ви вважаєте, що це питання можна вдосконалити та, можливо, знову відкрити, відвідайте довідковий центр для ознайомлення . Закрито …

6
Чи оптимізує Python хвостові рекурсії?
У мене є такий фрагмент коду, який не вдається із наступною помилкою: RuntimeError: перевищена максимальна глибина рекурсії Я спробував це переписати, щоб дозволити оптимізацію хвостової рекурсії (TCO). Я вважаю, що цей код мав би бути успішним, якби відбувся ТСО. def trisum(n, csum): if n == 0: return csum else: return …

5
Які, якщо такі, компілятори C ++ роблять оптимізацію хвостової рекурсії?
Мені здається, що було б ідеально справно робити оптимізацію хвостової рекурсії як в C, так і в C ++, але під час налагодження я ніколи не бачу фреймового стека, який вказує на цю оптимізацію. Це добре, бо стек підказує мені, наскільки глибока рекурсія. Однак оптимізація також була б приємною. Чи …

8
Як саме працює хвоста рекурсія?
Я майже розумію, як працює хвостова рекурсія та різниця між нею і нормальною рекурсією. Я тільки не розумію, чому йому не потрібен стек, щоб запам'ятати його зворотну адресу. // tail recursion int fac_times (int n, int acc) { if (n == 0) return acc; else return fac_times(n - 1, acc …

6
Чому .NET / C # не оптимізується для рекурсії хвостових викликів?
Я знайшов це питання про те, які мови оптимізують хвостову рекурсію. Чому C # не оптимізує рекурсію хвоста, коли це можливо? Для конкретного випадку, чому цей метод не оптимізований у цикл ( Visual Studio 2008 32-розрядний, якщо це має значення) ?: private static void Foo(int i) { if (i == …

5
Чи запобігає JVM оптимізація виклику хвоста?
Я побачив цю цитату на запитанні: що є хорошою функціональною мовою, на якій можна побудувати веб-сервіс? Зокрема, Scala не підтримує усунення хвостових викликів, за винятком саморекурсивних функцій, що обмежує види композиції, яку ви можете виконати (це фундаментальне обмеження JVM). Це правда? Якщо так, то що з СВМ створює це фундаментальне …

5
Чи виконує Ruby оптимізацію хвостових дзвінків?
Функціональні мови призводять до використання рекурсії для вирішення багатьох проблем, і тому багато з них виконують Оптимізацію виклику хвоста (TCO). TCO викликає виклики функції з іншої функції (або її самої, в цьому випадку ця функція також відома як Усунення рекурсії хвоста, що є підмножиною TCO), як останній крок цієї функції, …


4
Чи має Haskell рекурсивно-рекурсивну оптимізацію?
Сьогодні я виявив команду "time" в unix і подумав, що використаю її, щоб перевірити різницю у виконанні між рекурсивними хвостами та нормальними рекурсивними функціями в Haskell. Я написав такі функції: --tail recursive fac :: (Integral a) => a -> a fac x = fac' x 1 where fac' 1 y …

2
Чому рекурсивний виклик викликає StackOverflow на різній глибині стека?
Я намагався з'ясувати, як обробляються зворотні виклики компілятором C #. (Відповідь: це не так. Але 64-бітні JIT (і) будуть виконувати TCE (усунення хвостового виклику). Застосовуються обмеження .) Тому я написав невеликий тест, використовуючи рекурсивний виклик, який друкує, скільки разів його викликають до того, StackOverflowExceptionяк процес вбиває. class Program { static …

1
Як міркувати про безпеку стеків у 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): Pull[F,O,Unit] = { s.pull.uncons.flatMap { …
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.