Я напишу рекурсивную функцию И тыукажешь базовый случай? И ты,укажешь базовый случай? Я напишу р / Энакин и Падме на пикнике :: it-юмор :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

geek Энакин и Падме на пикнике it-юмор 
Я напишу рекурсивную функцию
И тыукажешь базовый случай?
И ты,укажешь базовый случай?
Я напишу рекурсивную функцию
Я ивлишу рекурсивную, функцию,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,Энакин и Падме на пикнике,it-юмор
Подробнее
Я напишу рекурсивную функцию И тыукажешь базовый случай? И ты,укажешь базовый случай? Я напишу рекурсивную функцию Я ивлишу рекурсивную, функцию
geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,Энакин и Падме на пикнике,it-юмор
Еще на тему
Развернуть
А зачем?
Рано или поздно оно само остановится. Или по стеку, или по памяти.
Может ещё по ограничителю глубины рекурсии выпасть, но это наш путь.
Ascard Ascard 16.06.202115:37 ответить ссылка 2.1
Так базовый вариант возврата для этого и делается, чтобы такого не происходило
Зачем, когда можно обернуть в try...catch возвратить из catch?
Вопрос, ловится ли переполнение стека в try...catch, предлагаю не поднимать.
Ascard Ascard 16.06.202116:22 ответить ссылка 1.2
Упавший по этой причине сервис предлагаю тоже не подымать.
Wolfdp Wolfdp 16.06.202117:28 ответить ссылка 13.0
Ascard Ascard 16.06.202117:34 ответить ссылка 2.3
и что в catch будет возвращать функция?
lexasan lexasan 16.06.202117:44 ответить ссылка -0.6
что успела насчитать до catch то и вернёт
хуже уже не будет
Ascard Ascard 16.06.202117:46 ответить ссылка -0.2
Я всё же предлагаю сделать рекурсивный вызов опять
lexasan lexasan 16.06.202117:49 ответить ссылка -0.5
Не, фигня получается
опять считать уже посчитанное - не оптимально
предлагаю или мемоизировать результаты предыдущей рекурсии
или распараллеливать текущую
как - хрен знает, не ко мне вопрос, я не джун, я тимлид, я думаю стратегически
Ascard Ascard 16.06.202117:53 ответить ссылка 0.2
Зачем опять считать посчитанное, пусть дальше считает, нечего всяким ссаным исключениям нарушать работу функции
lexasan lexasan 16.06.202117:54 ответить ссылка -0.6
мы же в catch, а значит оно уже посчитало
дальше только два выхода - в консоль или в глобальный catch
Ascard Ascard 16.06.202117:57 ответить ссылка -0.6
public neverGiveYouUp()
{
try {
neverGiveYouUp()
} catch (ANYException e) {
neverGiveYouUp()
} finally {
System.out.println("Life is strange");
neverGiveYouUp()
}
}
lexasan lexasan 16.06.202118:05 ответить ссылка -1.5
Код весьма бесполезен, несмотря на меметичность, нормальный компилятор соптимизировал бы его напрочь, если бы не println
Ascard Ascard 16.06.202119:26 ответить ссылка -0.6
Пиздец какие все серьезные) Шутка же, доведенная до абсурда
Чет ни одного варианта с выходом через goto не обыграли.
Правильно так:

public neverGonnaGiveYouUp() {
 try {
  neverGonnaLetYouDown();
 } catch (ANYException e) {
  neverGonnaRunAroundAndDesertYou();
 } finally {
  neverGonnaGiveYouUp();
 }
}
Словится. В процессе обратной раскрутки колстека при ловле исключений часть стека очищается, что позволяет программе продолжить работать.
Тогда остаётся вопрос будет ли в этом продолжении работы смысл уже. Несмотря на весь юмор, если мы довели до переполнения стека, упали в кетч, положили на это хер, и пошли дальше : явный признак что у нас что-то сделано не так в коде, причём в генетическом. И наверное кроме переполнения буфера, есть ещё и переполнение количества хромосом.
Ascard Ascard 21.06.202112:56 ответить ссылка 0.0
Бесконечная рекурсия возможна либо при бесконечных данных (что невозможно), либо на закольцованных. При закольцованных данных у автора кода могут быть обоснованные предположения о том, что при достижении переполнения стека необходимая работа уже сделана. Например если это вычисление какого-нибудь числа Пи, то в момент достижения предела стека мы можем считать что вычислили Пи с максимально возможной точностью. Если же данные не бесконечные и не закольцованные, то критерий выхода так или иначе возникает (даже если это NullReferrenceException).
В чём проблема с получением бесконечных данных? Например можно читать /dev/urandom потоком, или из осмысленного - получение данных с внешних датчиков, например температуры или потока с веб-камеры, оставляя за скобками вопрос работы с такими данными через рекурсию.
А с вычислением того-же числа Пи рекурсивной функцией это странный пример. Начиная с того что проще взять значение нужной точности со спец.сайта, а не расходовать впустую мощность, вычисляя самому. И заканчивая тем что глубина рекурсии в этом случае может быть разной, и меняться от запуска к запуску. Или вообще, например как в Java, зависеть от версии или даже ключа запуска. Уж если возникло странное желание повычислять Пи то уж разложи рекурсию в цикл и вычисляй с НУЖНОЙ точностью.
А закольцованные данные это как?
Чёто мы с юмор и сарказма в серьёзное дерьмо переехали
Ascard Ascard 21.06.202114:03 ответить ссылка 0.0
Вы правы, бесконечный поток данных возможен, но обработка его рекурсивными методами и правда кажется мне совершенно безумной идеей.
Вычисление числа Пи было взято в качестве абстрактного примера. Допустим это не константа, а некоторое значение, которое необязательно должно быть совершенно точным, но желательно рассчитать его поточнее и за ограниченное количество времени, а рекурсивный метод сочтён аналитиками оптимальным с точки зрения соотношения затрат к точности. В этом случае не важно, что результат будет иметь разную точность при разных запусках, важно что это лучшее что мы можем выдать за приемлемое время.
Закольцованные данные это, например, когда ты рекурсивно обходишь деревообразную структуру, где потомок может быть предком самого себя.
Вот про дерево сам вспомнил, но уже после того как нажал отправить.
А аналитики странные, рекурсия вроде бы в любом современном языке по умолчанию тяжелее цикла (если компилятор сам не разложил её в цикл), за счёт как раз накладных расходов на стек и прочее. Допускаю что бывают задачи когда точность не сильно важна, но вот не могу представить такую где было бы нормально считать до упора, а сколько там получится по итогу - не сильно важно. Железо всё таки дешёвое но не бесконечное, особенно если надо ответить на сетевой запрос который висит, ждёт ответа и занимает целый сокет. Особенно если можно не вычислять вовсе, а подсунуть готовое значение.
Имхо рекурсия в коде это больше для удобства программиста, потому что этот самый код проще и очевиднее.
Ascard Ascard 21.06.202114:55 ответить ссылка 0.6
Удобен он только первый раз, когда его сочиняешь. Понять уже написанную рекурсию сложнее, чем уже написанный цикл.
Да, наверняка в большинстве случаев рекурсия дороже цикла и по памяти и по сложности, но есть ещё один важный фактор: стоимость переписывания рекурсии на цикл. Я никогда не видел, чтобы кто-то ловил StackOwerflowException в рекурсивном алгоритме, но я был свидетелем ловли OutOfMemoryException с последующим разбиванием "слишком большого для обработки" дерева на части в catch-секции. Это было грубым, но дешёвым решением, в смысле затрат человеко/часов. При этом понятно, что возникло оно когда стало ясно, что OutOfMemoryException возникают на практике, а не когда мы проектировали алгоритм в целом.
А что сложного в понимании рекурсии? Имхо она как раз таки проще для понимания. У тебя есть одна функция, и они вызывает саму себя. У функции есть её сигнатура, и её надо просто вызывать. А не следить, как с циклом, что мы занесли в цикл, что поменяли, и что надо вынести из него для следующего шага. И это если не городить огород с тем что цикл будет ходить по очереди или стеку, с ретраями, с дебаунсерами и прочим свистоперделками которые так и хочется навернуть сверху. Рекурсивная функция, по определению, на каждом шаге работает одинаково, а у цикличной реализации возможны варианты. Как с тем же обходом дерева: там всё равно с корня или с ветки начинается его обход, он будет работать одинаково. И выдавать стабильный результат. Как только мы его надумали разложить в цикл, сразу возникает нужда придумать структуры для хранения состояния, решить как будем по ним ходить, в каком скоупе, в каком потоке, как туда внешние зависимости передать и т.д.
Ascard Ascard 22.06.202114:37 ответить ссылка 0.6
Поведение рекурсивной функции на каждом этапе зависит от того, "в каком месте данных" она находится. Её очень трудно отлаживать, потому что под отладкой заполнить нужными данными массив и переместить индекс с первой позиции на десятую - легко, а вот рекурсивную функцию на 10 уровней вложенности вниз не передвинешь.
Это же можно сказать про любые сложные данные и сложный алгоритм. Замени рекурсию на многопоточность и получишь тот же геморрой, вид сбоку. А рекурсию как раз таки передвинуть на 10 уровней должно быть легко (в теории), она же самоподобна, достаточно знать что там через 10 уровней будут за аргументы. В любом случае, это всё вкусовщина. Кто к чему привык, тот так и пишет
Ascard Ascard 24.06.202108:40 ответить ссылка 0.0
Фишка рекурсивных функций в том, что callstack является, по сути, одним из входных аргументов функции, а его не подделаешь. Если в плоской функции передвинуть индекс в цикле сразу на 10 позицию, то по завершении итерации цикл перейдёт к 11й позиции. А если рекурсивную функцию запустить сразу начиная с 10го потомка, то по завершении работы с ним она просто завершит работу, а не вернёт управление самой себе.
Это лишь особенности реализации, они есть везде. Например, у асинхронных функций вообще может не быть колстека, или он будет кривой, как в JS. Не показатель вообще. Рекурсия это лишь один из вариантов. Для деревьев - удобно, для больших список - неудобно, глубина мелкая. Только и всего. Тут не о чём особо спорить
Ascard Ascard 24.06.202115:14 ответить ссылка 0.0
смотря на чём и как писать. там, где есть tail call optimization, не остановится.
nanoo nanoo 17.06.202111:56 ответить ссылка 0.0
ну мы же не ищем лёгких путей, иначе просто развернули бы рекурсию сами.
тащемто мы тут в юмор пытались, а ты сюда на серьёзных щщах влетаешь
Ascard Ascard 17.06.202112:03 ответить ссылка 0.0
Без перевода же. А так запостили с разницей в несколько минут, пока я гонял через баянометры и вспоминал тэги.
йааааааа!!!
СлооожнаааааШ!
Stormo Stormo 16.06.202120:26 ответить ссылка -1.7
Рекурсивная функция - это функция, которая вызывает сама себя, пока не наткнется на базовый случай. Если базовый случай не обозначить, она так и будет вызывать сама себя, пока не превратится в ком из сожранной памяти. Мало того, что рекурсивные функции надо использовать аккуратно, так за такие ошибка надо вообще ссать на глаза.
разве это рекурсия?
Megalex Megalex 16.06.202120:26 ответить ссылка -0.5
всё просто.
точка, в которой значение функции равно её аргументу называется fixed point.
функция, которая принимает функцию и возращает её fixed point называется fixed point combinator. У любой функции есть fixed point (теорема, в лямбда исчислении доказана)
по определению:
f x0 = x0, Y f = x0
подставляем второе в первое:
f (Y f) = Y f
подставляем правую часть в левую:
f (f (Y f)) = Y f
подставляем правую часть в левую:
f (f (f (Y f))) = Y f
подставляем правую часть в левую:
f (f (f (f (Y f)))) = Y f
подставляем правую часть в левую:
f (f (f (f (f (Y f))))) = Y f
подставляем правую часть в левую:
f (f (f (f (f (f (Y f)))))) = Y f

короче я думаю принцип понятен
nanoo nanoo 17.06.202112:05 ответить ссылка 0.1
Для далёкого совсем нихуя не понятно описал.
чувак, я и сам это не понимаю.
nanoo nanoo 17.06.202115:19 ответить ссылка 0.8
> У любой функции есть fixed point (теорема, в лямбда исчислении доказана)

Што? В данной формулировке утверждение неверно. Например, когда область определения и область значений функции не пересекаются. И даже если пересекаются: f(x) = x + 1.
dadv dadv 22.06.202119:06 ответить ссылка 0.0
http://www.cse.chalmers.se/research/group/logic/TypesSS05/Extra/geuvers.pdf теорема 2.12
как я выше написал, я сам не понимаю как оно так получается. подозреваю, что ф-ии лямбда исчисления это не те ф-ии которые в матанализе например, по этому для ф-ий из матана это не верно, но это не точно. отвечаю поздно, потому что был в бане.
nanoo nanoo 07.07.202119:13 ответить ссылка 0.0
> У любой функции есть fixed point

И вовсе не "у любой функции". А у любого терма из лямбда-исчисления, это совсем не значит "у любой функции".
dadv dadv 08.07.202112:17 ответить ссылка 0.0
ну так application это один из лямбда термов, а application и есть ф-ия, не?
nanoo nanoo 08.07.202118:35 ответить ссылка 0.0
Но не любая, а из лямбда-исчисления.
dadv dadv 08.07.202122:37 ответить ссылка 0.0
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
■
л
Pi %
\
ч
л
г
» %
г V
!•
ИДЯ изучаю CSS •* В базе данных, да? I’m going to write a recursive function
Pm going to write a recursive function