Учебники

Эликсир — Рекурсия

Рекурсия — это метод, в котором решение проблемы зависит от решения меньших экземпляров той же проблемы. Большинство языков программирования поддерживают рекурсию, позволяя функции вызывать себя внутри текста программы.

В идеале рекурсивные функции имеют конечное условие. Это конечное условие, также известное как базовый случай, прекращает повторный ввод функции и добавление вызовов функций в стек. На этом рекурсивный вызов функции останавливается. Давайте рассмотрим следующий пример, чтобы лучше понять рекурсивную функцию.

Live Demo

defmodule Math do
   def fact(res, num) do
   if num === 1 do
      res
   else
      new_res = res * num
      fact(new_res, num-1)
      end
   end
end

IO.puts(Math.fact(1,5))

Когда вышеуказанная программа запускается, она генерирует следующий результат —

120

Таким образом, в приведенной выше функции, Math.fact , мы вычисляем факториал числа. Обратите внимание, что мы вызываем функцию внутри себя. Давайте теперь поймем, как это работает.

Мы предоставили ему 1 и число, чей факториал мы хотим вычислить. Функция проверяет, является ли число 1 или нет, и возвращает res, если оно равно 1 (Условие завершения) . Если нет, то он создает переменную new_res и присваивает ей значение предыдущего res * current num. Он возвращает значение, возвращенное фактом вызова нашей функции (new_res, num-1) . Это повторяется до тех пор, пока мы не получим num как 1. Как только это произойдет, мы получим результат.

Давайте рассмотрим другой пример, печатая каждый элемент списка по одному. Для этого мы будем использовать функции hd и tl списков и сопоставления с образцом в функциях —

Live Demo

a = ["Hey", 100, 452, :true, "People"]
defmodule ListPrint do
   def print([]) do
   end
   def print([head | tail]) do 
      IO.puts(head)
      print(tail)
   end
end

ListPrint.print(a)

Первая функция печати вызывается, когда у нас есть пустой список (конечное условие) . Если нет, то будет вызвана вторая функция печати, которая разделит список на 2 и назначит первый элемент списка заголовку, а оставшийся список — хвосту. Затем печатается голова, и мы снова вызываем функцию печати с остальной частью списка, т. Е. С хвостом. Когда вышеуказанная программа запущена, она дает следующий результат —