Elixir & Phoenix: Scalable Backend Development · Pelajaran

Rekursi dan Fungsi Orde Tinggi

Pahami rekursi sebagai konsep fungsional yang mendasar dan pelajari fungsi orde tinggi untuk mengabstraksikan perilaku.

Pelajaran 3 dari 412 langkah

Rekursi dan Fungsi Orde Tinggi adalah pelajaran Elixir & Phoenix: Scalable Backend Development gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Elixir & Phoenix: Scalable Backend Development, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Elixir & Phoenix: Scalable Backend Development mencakup 4 pelajaran total.

Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.

Meet Recursion in Elixir

Welcome to recursion! In functional programming, recursion is a powerful technique where a function calls itself to solve a problem.

Instead of using loops (like for or while in other languages), Elixir often relies on recursion to iterate over data or repeat actions. It's a core concept you'll use a lot!

The Two Pillars of Recursion

Every recursive function needs two main parts to work correctly:

  • Base Case: This is the stopping condition. It defines when the function should stop calling itself and return a direct result. Without it, your function would run forever!
  • Recursive Step: This is where the function calls itself again, but with a smaller or simpler version of the original problem. Each call moves closer to the base case.

Recursion in Action: Factorial

Let's see recursion with a classic example: calculating the factorial of a number. The factorial of n (written as n!) is the product of all positive integers less than or equal to n. For example, 5! = 5 * 4 * 3 * 2 * 1 = 120.

Notice how factorial(n) calls factorial(n - 1) until it hits the base case of 0.

defmodule Math do
  def factorial(0), do: 1
  def factorial(n) when n > 0, do: n * factorial(n - 1)
end

IO.puts "Factorial of 5: #{Math.factorial(5)}"

Efficient Recursion: Tail Calls

While recursion is great, naive recursion can sometimes lead to performance issues or 'stack overflows' for very deep calls.

Elixir (and the Erlang VM) offers Tail Call Optimization (TCO). If the recursive call is the very last operation in a function, the VM can optimize it, preventing new stack frames from being created. This makes tail-recursive functions as efficient as loops!

Optimizing with Tail Recursion

To achieve TCO, we often use an accumulator. This is an extra argument passed to the function that collects the result as the recursion progresses.

Compare this version to the previous one. The recursive call factorial(n - 1, n * acc) is the last thing happening in the function, making it tail-recursive.

defmodule Math do
  # Public interface, calls the private tail-recursive function
  def factorial(n), do: factorial(n, 1)

  # Private tail-recursive function with accumulator
  defp factorial(0, acc), do: acc
  defp factorial(n, acc) when n > 0, do: factorial(n - 1, n * acc)
end

IO.puts "Tail factorial of 5: #{Math.factorial(5)}"

Functions as First-Class Citizens

Now, let's explore Higher-Order Functions (HOFs). In Elixir, functions are 'first-class citizens'. This means you can:

  • Pass functions as arguments to other functions.
  • Return functions as results from other functions.
  • Assign functions to variables.

HOFs enable powerful abstractions, making your code more concise, flexible, and reusable.

Transforming Lists with Enum.map

Enum.map/2 is one of the most common HOFs. It takes an enumerable (like a list) and a function. It applies that function to each element and returns a new list with the transformed elements.

It never modifies the original list, embracing Elixir's immutability.

numbers = [1, 2, 3, 4]
doubled_numbers = Enum.map(numbers, fn n -> n * 2 end)

IO.puts "Original: #{inspect numbers}"
IO.puts "Doubled: #{inspect doubled_numbers}"

Filtering Lists with Enum.filter

Another handy HOF is Enum.filter/2. It takes an enumerable and a function that should return a boolean (true or false).

It returns a new list containing only the elements for which the function returned true. It's perfect for selecting specific items from a collection.

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = Enum.filter(numbers, fn n -> rem(n, 2) == 0 end)

IO.puts "Original: #{inspect numbers}"
IO.puts "Even: #{inspect even_numbers}"

Aggregating with Enum.reduce

Enum.reduce/3 is perhaps the most powerful HOF for working with enumerables. It takes an enumerable, an initial accumulator value, and a function.

It iterates through the collection, applying the function to each element and the current accumulator, eventually reducing the entire collection to a single value.

numbers = [1, 2, 3, 4]
sum = Enum.reduce(numbers, 0, fn n, acc -> n + acc end)
product = Enum.reduce(numbers, 1, fn n, acc -> n * acc end)

IO.puts "Numbers: #{inspect numbers}"
IO.puts "Sum: #{sum}"
IO.puts "Product: #{product}"

Anonymous Functions and HOFs

You've seen fn n -> n * 2 end. These are anonymous functions (or lambdas). Elixir provides a shorthand for simple anonymous functions:

  • &1 refers to the first argument.
  • &2 refers to the second argument, and so on.
  • &(&1 + &2) is equivalent to fn a, b -> a + b end.

This makes HOF calls even more concise!

numbers = [1, 2, 3, 4]
doubled_short = Enum.map(numbers, &(&1 * 2))
even_short = Enum.filter(numbers, &(rem(&1, 2) == 0))

IO.puts "Doubled (short): #{inspect doubled_short}"
IO.puts "Even (short): #{inspect even_short}"

Test Your HOF Knowledge

Higher-Order Functions are a cornerstone of functional programming in Elixir. Let's check your understanding.

Recursion & HOFs: Key Takeaways

Great job! In this lesson, you've grasped two fundamental concepts in functional Elixir:

  • Recursion: A function calling itself, defined by a base case and a recursive step.
  • Tail Call Optimization (TCO): An important Elixir feature for efficient, stack-safe recursion, often achieved with an accumulator.
  • Higher-Order Functions (HOFs): Functions that take other functions as arguments or return them, like Enum.map, Enum.filter, and Enum.reduce.
  • Anonymous Functions: Concise ways to define functions inline, often used with HOFs, including the &1 shorthand.

These tools are essential for writing expressive and powerful Elixir code. Keep practicing!

Gratis untuk memulai

Belajar Elixir dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
12
Pelajaran
48

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Rekursi dan Fungsi Orde Tinggi” gratis?

Ya — teks lengkap “Rekursi dan Fungsi Orde Tinggi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Elixir & Phoenix: Scalable Backend Development, upgrade ke CoddyKit PRO. Kursus Elixir & Phoenix: Scalable Backend Development mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Rekursi dan Fungsi Orde Tinggi”?

Pahami rekursi sebagai konsep fungsional yang mendasar dan pelajari fungsi orde tinggi untuk mengabstraksikan perilaku. Kamu berlatih Elixir & Phoenix: Scalable Backend Development dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Elixir & Phoenix: Scalable Backend Development?

Tidak diperlukan pengalaman sebelumnya. Elixir & Phoenix: Scalable Backend Development di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Rekursi dan Fungsi Orde Tinggi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Elixir & Phoenix: Scalable Backend Development ini?

Ya. Setiap pelajaran Elixir & Phoenix: Scalable Backend Development menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Fungsi, Modul, dan Pemipaan
  2. Bekerja dengan Koleksi Enumerable
  3. Rekursi dan Fungsi Orde Tinggi
  4. Evaluasi Malas dengan Modul Stream
← Kembali ke Elixir & Phoenix: Scalable Backend Development