% bakterie(N, T) -> R % kde N je počet bakterií na začátku, % T je počet hodin experimentu % R výsledek - počet bakterií na konci experimentu bakterie(N, T) -> % Budeme simulovat po půlhodinách % bakterie mohou být na konci každé půlhodiny jen dvou druhů % A - bakterie staré půl hodiny % B - čerstvě narozené bakterie % počet kroků simulace bude T*2 % výsledek dostaneme zavoláním funkce % bakterie(A, B, K) bakterie(0, N, 2*T). % bakterie(A, B, K) -> R % kde A je počet půl hodiny starých bakterií % B je počet nových bakterií % K je počet půlhodin do konce experimentu % R je počet bakterií na konci experimentu bakterie(A, B, 0) -> % počet kroků simulace je nula % tedy vrátíme počet žijících bakterií A+B; bakterie(A, B, K) when K>0 -> % na konci půlhodiny bude % B půlhodiny starých bakterií % a A+B nově narozených bakterií % (půlhodiny staré bakterie budou staré hodinu % rozdělí se na A bakterií a zemřou -> A, % nové bakterie se poprvé rozdělí a vznikne B) bakterie(B, A+B, K-1).S vynecháním komentářů celý program:
-module(bakterie). -export([bakterie/0, start/0]). start() -> bakterie(), init:stop(). bakterie() -> {ok, [N, T]} = io:fread([], "~d ~d"), R = bakterie(N, T), ok = io:format("~b~n", [R]). bakterie(N, T) -> bakterie(0, N, T * 2). bakterie(A, B, 0) -> A + B; bakterie(A, B, K) when K > 0 -> bakterie(B, A + B, K - 1).Dtto v C:
#include <stdio.h> int Bakterie(int stare, int nove, int pulh){ return pulh > 0 ? Bakterie(nove, nove+stare, pulh - 1) : nove+stare; } int main(void){ int cas, pocet; scanf("%d %d", &pocet, &cas); printf("%d\n", Bakterie(0, pocet, cas * 2)); return 0; }Stačí srovnat se vzorovou implementací a rozdíl je vidět na první pohled. "Ukázkové" řešení je O(N^2) time a O(N) space, používá jakéhosi vedlejší znalosti - komplikované, hnusné a nečitelné. Uvedené řešení je proti tomu KISS, tedy naprosto přímočaré bez nutnosti vědět o existenci nějaké fibonačiho řady. Prostě řeší přímo zadání. Je navíc O(N) time a O(1) space. Existuje ještě O(logN) řešení, ale to bych sem netahal (viz SICP tuším druhá kapitola). V praxi se setkávám právě s tím, že lidi ze škol nedokáží řešit problém přímočaře a nekomplikovaně. Prostě KISS! Přílišná akademičnost škodí. Kdyby raději na školách učili třeba podle SICP, sice je to akademické, ale KISS. Tisíckrát radši, než tyhle překomplikované a nesmyslné sajrajty, které neučí hlavně programátorsky myslet.