Recursion replaces loops

Contents
No loops in Elixir
Recurse with an accumulator
Tail calls
Reach for Enum first

No loops in Elixir

Elixir has no while statement that ticks a mutable counter up and down.

Repetition happens when a function calls itself with new arguments, and a base clause stops the chain.

The clause below stops at zero, while the second clause prints and counts down.

defmodule Count do def down(0), do: :done def down(n) when n > 0 do IO.puts(n) down(n - 1) end end

Recurse with an accumulator

An accumulator carries the running result, so each call does a little work and passes the rest forward.

The empty list clause returns the total, and the second clause adds the head and recurses on the tail.

The call below walks three items and answers with their sum.

defmodule Math do def sum(list), do: total(list, 0) defp total([], acc), do: acc defp total([head | tail], acc), do: total(tail, acc + head) end Math.sum([1, 2, 3])

Tail calls

A tail call is a recursive call in the last position, with no work left after it returns.

The virtual machine reuses the same frame for such calls, so deep recursion stays lean.

The sketch below keeps the product in acc and finishes the moment it reaches zero.

defmodule Fact do def of(n), do: go(n, 1) defp go(0, acc), do: acc defp go(n, acc), do: go(n - 1, n * acc) end Fact.of(5)

Reach for Enum first

Hand written recursion teaches the idea, but daily code uses the Enum module.

Map transforms each item, sum adds them up, and the pipe threads the list through each step.

Reach for these helpers before writing a recursive helper by hand.

[1, 2, 3] |> Enum.map(&(&1 * 2)) |> Enum.sum()

Next: Lists

Article author: Arthur Isaev

Related articles
Elixir
Elixir course: zero to hero in 50 lessons
What is Elixir and where it runs
Install Elixir
iex: the interactive shell
Your first script
Variables
Numbers
Strings
Atoms
Truthiness: only false and nil
Conditions
Recursion replaces loops
Lists
Tuples
Maps
Keyword lists
Functions
Defaults and clauses
Pattern matching
case
with chains
Modules in Elixir
import, alias, require, use in Elixir
Structs in Elixir
Protocols in Elixir
Behaviours in Elixir
The pipe operator in Elixir
Enum in Elixir
Stream in Elixir
Comprehensions in Elixir
Advanced strings in Elixir
Sigils
Binaries and charlists
Exceptions
ok and error tuples
Files and IO
Processes
GenServer
Supervisors
Tasks and Agents
OTP applications
Mix projects
Dependencies
Testing with ExUnit
Doctests
Debugging
Configs
Releases
Capstone: todo CLI
Capstone: HTTP server
Hero roadmap: the whole course on one page
Install Elixir on Windows 11
Install Elixir on Ubuntu
Install Elixir on Rocky Linux
Install Elixir on macOS
Install Elixir on FreeBSD
Elixir in Docker

Search this site

Channel @aofeed Chat @aofeedchat

Contacts and cooperation:
I recommend our hosting beget.com
Write to info@aredel.com if you:
1. Want to write an article for our site or translate an article into your native language.
2. Want to place thematically relevant ads on the site.
3. Ads on my site pass maximum censorship. If you see an ad block unsuitable for school-age children, shocking or misleading - please contact us by e-mail
4. Found a mistake, inaccuracy, bug, etc. on the site. ... .......
5. Articles can be shared on social media by clicking a network icon: