Deklaratív programozás mintazárthelyi, 2008. november 3. ======================================================== ERL megoldások, 1.0. változat, dp08a-zh-minta-erl-megold.txt ============================================================ 5. Mi az X értéke az alábbi, egymástól független deklarációk kiértékelése után? (6p, 2p/részfeladat) (a) X = concat(filter(fun([_|_]) -> true; (_) -> false end, [2,[3],[6,1],[5]])). X = [3, 6, 1, 5]. (b) X = 5 * (case {a, 4, 6} of {A, B} -> B; C -> {_, D, E} = C, E; {a,F, G} -> F end). X = 30. (c) X = [{X, Y} || X <- seq(1, 10), Y <- seq(1, 10), X * X == Y]. X = [{1, 1}, {2, 4}, {3, 9}]. 6. Tekintsük a következő függvénydefiníciókat! (9p, (a)-(c): 1p/részfeladat, (d)-(e): 3p/részfeladat) g([X, Y | Z]) -> if X < Y -> [X | g([Y | Z])]; true -> [Y | g([X | Z])] end; g(Z) -> Z. h(Z) -> h(Z, length(Z) - 1). h(Z, 0) -> Z; h(Z, C) -> h(g(Z), C - 1). Mi az X értéke az alábbi egymástól független deklarációk kiértékelése után? (a) X = g([]). X = []. vagy X = "". (b) X = g("a"). X = "a" vagy X = [97]. (és így tovább, a stringek helyett mindig lehet a lista reprezentációját írni) (c) X = g("alma"). X = "alam". (d) X = h("alma"). X = "aalm". (e) X = h("korte"). X = "ekort". 7. Készítsen az alábbival megegyező funkciójú jobbrekurzív függvényt, és mutasson egy példát a hívására! (7p) %% rev([any()]) -> [any()] rev([A | Z]) -> rev(Z) ++ [A]; rev([]) -> []. Hívása: rev("alma"). Megoldás: rev([A | Z], Acc) -> rev(Z, [A | Acc]); rev([], Acc) -> Acc. Hívása: rev("alma", []). Vagy pl. be is vezethetik az egy argumentumú rev függvényt is, ekkor: rev(Z) -> rev(Z, []). Hívása: rev("alma"). 8. Emelkedőnek nevezzük az olyan {x, y, z} hármasokat, amelyekre x < y < z. Írjon olyan függvényt emelkedők néven, amely egy [{integer(), integer(), integer()}] típusú listában található emelkedő hármasok számát adja eredményül. Törekedjék hatékony megoldásra, magasabb rendű függvény alkalmazására. Segédfüggvényt definiálhat, ha ír hozzá fejkommentet. (8p) %% emelkedok([{integer(), integer(), integer()}]) -> integer() %% A bemeneti listában szereplő emelkedő hármasok száma Példák: emelkedok([]) == 0. emelkedok([{3,4,4}]) == 0. emelkedok([{3,4,5}]) == 1. emelkedok([{2,5,8},{6,9,9},{8,8,9},{-2,3,8},{3,4,5}]) == 3. Megoldás: emelkedok(L) -> lists:foldl(fun({X, Y, Z}, Acc) when X < Y andalso Y < Z -> Acc + 1; (_, Acc) -> Acc end, 0, L). Pontozás: Minden kisebb hibáért 1-1 pont, minden súlyos hibáért 2 vagy 3 pont levonás. Súlyos hibának számít pl. a végtelen rekurzió (-3 pont). Fejkomment hiánya: -2 pont, de nem követelmény a fejkommentben a függvény típusának specifikálása. Nem követelmény a hatékony program sem.