1. kis házi feladat: Hányféle

Kiadás: 2025-09-17, beadási határidő a honlapon.
Verzió: $LastChangedDate: 2025-10-08 16:34:41 +0200 (Wed, 08 Oct 2025) $

Írjon olyan Elixir-függvényt hanyfele néven, amely megszámolja, hogy egy adott nemnegatív egész célértéket hányféleképpen lehet előállítani adott pozitív egész számokból, összeadással.

A függvény paraméterei:

A függvény a célérték lehetséges előállításainak számát adja eredményül. Az előállítások számlálásában nem különböztetjük meg azokat az összegkifejezéseket, amelyek csak az összeadandók sorrendjében vagy az összeadások zárójelezésében térnek el egymástól.

Nagy célértékekre is működő, hatékony megoldást várunk.

Megjegyzés: Az első paramétert ún. multihalmaz (másnéven bag, magyarul zsák) alakban adjuk meg. Esetünkben a zsák elemei egy szótár kulcsai, a kulcsokhoz rendelt érték pedig a számosságuk (multiciplitásuk). A klasszikus multihalmaz elemei korlátos számosságúak, az általánosított multihalmaz elemei között korlátlan számosságúak is lehetnek.

Elixir-specifikációk

  @type ertek() :: integer() # az összeg előállítására felhasználható érték (0 < ertek)
  @type darab() :: integer() # az értékből rendelkezésre álló maximális darabszám (0 ≤ darabszám)
  @type ertekek() :: %{ertek() => darab()}
  @spec hanyfele(ertekek :: ertekek(), celertek :: integer()) :: ennyifele :: integer()
  # ennyifele a celertek összes különböző előállításainak száma ertekek felhasználásával

Egyéb követelmények

A modul neve Khf1 legyen, a @moduledoc szakasz pedig legalább a szerző nevét, email-címét és a dátumot tartalmazza.
  defmodule Khf1 do
  @moduledoc """
  Hányféle módon állítható elő a célérték
  @author "Egyetemi Hallgató <egy.hallg@edu.bme.hu>"
  @date   "2025-09-xx"
  """
  ...
  end
Ha segédfüggvényeket használ, legyenek lokálisak (defp), és írjon hozzájuk típusspecifikációt és fejkommentet.

A beadott programokat Linux környezetben Elixir 1.18 (Erlang/OTP 28) rendszerrel teszteljük.

Példák

  iex> Khf1.hanyfele(%{1 => 2, 2 => 3, 3 => 4}, 4)
  3
  
  iex> Khf1.hanyfele(%{2 => 2, 1 => 1, 3 => 3}, 4)
  2
  
  iex> Khf1.hanyfele(%{3 => 1, 1 => 0, 2 => 0}, 4)
  4
  
  iex> Khf1.hanyfele(%{3 => 3, 2 => 1, 1 => 1}, 5)
  1
  
  iex> Khf1.hanyfele(%{1 => 0, 2 => 0, 3 => 0}, 20)
  44
  
  iex> Khf1.hanyfele(%{2 => 0, 3 => 0, 1 => 0}, 3000)
  751501
  
  iex> Khf1.hanyfele(%{1 => 50, 3 => 0, 2 => 0}, 3000)
  25309
  
  iex> Khf1.hanyfele(%{3 => 0, 1 => 100, 2 => 0}, 499_000)
  8399034
  
A fenti első példa esetén az eredmény az alábbi halmaz elemeinek a száma, azaz 3:

{ <x,y,z> | x≥0, y≥0, z≥0, x,y,z egészek, x≤2, y≤3, z≤4, x*1+y*2+z*3 == 4 } == {1+1+2, 1+3, 2+2}

Segédanyagok

  1. Sablon a program megírásához: khf1_sablon.exs
  2. Szkript tesztesetek futtatásához: khf1_teszt.exs

Tudnivalók a beadásról

DP Admin: dvacakrobotjaitoknakpadm@dp.iit.bme.hu Vissza az elejére / Back to the top