lonesome-rider

lonesome-rider

Why function runs in loop when there is not a for loop

I’m new to Elixir and currently trying to learn the language by reading the Book “Programming Elixir ≥ 1.6”. I’m now trying to solve the exercise “ModulesAndFunctions-6”. I honestly had to read the solution because I wasn’t being able to solve it and what caught my attention was that the function used in the exercise runs like in a loop even though there’s no loop used here. I’m also pretty new to functional languages and I want to understand what’s going on here.

Hope you can help me clarify this.

Thanks

First Post!

Eiji

Eiji

This is called a recursion. In short function calls itself as long as there is no call and therefore the result of expression at the end of function is returned. Elixir using a pattern-matching is doing a recursion based on input data. When it reach a specific function clause the algorithm finishes.

Let’s show it on simpler example:

defmodule Example do
  # here we check if input is integer and then if it's less than 0
  # if so we are using a recursive call with integer decreased by 1
  def sample(integer) when is_integer(integer) and integer > 0, do: sample(integer - 1)

  # here we check if input is integer and then if it's more than 0
  # if so we are using a recursive call with integer increased by 1
  def sample(integer) when is_integer(integer) and integer < 0, do: sample(integer + 1)

  # here we have a literal check, it works as same as
  # def sample(integer) when is_integer(integer) and integer == 0, do: :done
  # so if we enter 0 as argument or the argument in recursion call is decreased/increased to 0
  # then we return done atom
  def sample(0), do: :done
end

iex> Example.sample(-5)
:done

iex> Example.sample(0)
:done

iex> Example.sample(5)
:done

Last Post!

cjbottaro

cjbottaro

Recursion: when a function calls itself.

defmodule Infinite do
  def loop do
    IO.puts "stuck in an infinite loop"
    loop()
  end
end

iex> Infinite.loop()

Where Next?

Popular in Questions Top

New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 55125 245
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New

We're in Beta

About us Mission Statement