Введение
Рекурсия без вызова функции по имени
В информатике анонимная рекурсия — это рекурсия, которая не вызывает функцию явно по имени. Это можно сделать либо явно, используя функцию высшего порядка — передавая функцию в качестве аргумента и вызывая её, — либо неявно, через возможности рефлексии, которые позволяют получить доступ к определённым функциям в зависимости от текущего контекста, особенно к "текущей функции" или иногда к "функции, вызвавшей текущую функцию". На практике анонимная рекурсия заметно используется в JavaScript, который предоставляет средства рефлексии для её поддержки. Однако в общем программировании это считается плохим стилем, и вместо этого рекомендуется использовать рекурсию с именованными функциями. Анонимная рекурсия через явную передачу функций в качестве аргументов возможна в любом языке, поддерживающем функции как аргументы, хотя это редко используется на практике, поскольку это более громоздко и менее понятно, чем явный вызов рекурсии по имени. В теоретической информатике анонимная рекурсия важна, поскольку она показывает, что рекурсию можно реализовать без необходимости использования именованных функций. Это особенно важно для лямбда-исчисления, которое оперирует анонимными унарными функциями, но способно вычислять любую рекурсивную функцию. Такая анонимная рекурсия может быть получена обобщённо с помощью комбинаторов фиксированной точки.
In computer science, anonymous recursion is recursion which does not explicitly call a function by name. This can be done either explicitly, by using a higher order function – passing in a function as an argument and calling it – or implicitly, via reflection features which allow one to access certain functions depending on the current context, especially "the current function" or sometimes "the calling function of the current function". In programming practice, anonymous recursion is notably used in JavaScript, which provides reflection facilities to support it. In general programming practice, however, this is considered poor style, and recursion with named functions is suggested instead. Anonymous recursion via explicitly passing functions as arguments is possible in any language that supports functions as arguments, though this is rarely used in practice, as it is longer and less clear than explicitly recursing by name. In theoretical computer science, anonymous recursion is important, as it shows that one can implement recursion without requiring named functions. This is particularly important for the lambda calculus, which has anonymous unary functions, but is able to compute any recursive function. This anonymous recursion can be produced generically via fixed point combinators.
Использование
Анонимная рекурсия полезна прежде всего для обеспечения рекурсии анонимных функций, особенно когда они формируют замыкания или используются в качестве обратных вызовов, чтобы избежать необходимости привязывать имя функции. Анонимная рекурсия в основном заключается в вызове "текущей функции", что приводит к непосредственной рекурсии. Возможна также анонимная косвенная рекурсия, например, путем вызова "функции-вызывателя (предыдущей функции)" или, реже, путем перехода выше по стеку вызовов, что может быть организовано в цепочку для получения взаимной рекурсии. Самоссылка на "текущую функцию" является функциональным эквивалентом ключевого слова "this" в объектно-ориентированном программировании, позволяя ссылаться на текущий контекст. Анонимную рекурсию можно также использовать и для именованных функций, вместо вызова по имени, например, чтобы явно указать, что рекурсия выполняется на текущей функции, или чтобы разрешить переименование функции без необходимости изменения имени в месте ее вызова. Однако, с точки зрения стиля программирования, это обычно не делают.