Í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:
%{ertek => darabszam, ...}
alakban. Ha darabszám 0,
az adott értékből korlátlan mennyiség áll rendelkezésre.
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.
@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
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" """ ... endHa 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.
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) 8399034A 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}
DP Admin: dvacakrobotjaitoknakpadm@dp.iit.bme.hu | Vissza az elejére / Back to the top |