Užitečné posloupnosti pro algoritmy

V tomto článku se podíváme na užitečné posloupnosti pro algoritmy, které budou vázané na čítač, tj. číselný cyklus. Nějaký příklad? Pro cyklus i=1 až n můžeme potřebovat dvouhodnotový přepínač (True/False, 1/0, 1/2, číslo 1/číslo 2), nějaký způsob třídění, resp. rozpočítání do skupin a tak podobně. Obrázek ukazuje, jak takových posloupností dosáhnout s pomocí funkcí či operátorů.

Užitečné posloupnosti pro algoritmy (nejen) v Excelu
Užitečné posloupnosti pro algoritmy (nejen) v Excelu

Připomínám, že pod VBA se na funkce listu odkazujeme prostřednictvím WorksheetFunction, MOD je funkce listu a operátor ve VBA, funkce SIGN má ve VBA svůj ekvivalent v podobě funkce Sgn, a ke konstantě π si ve Visual Basicu můžeme dopomoci prostřednictvím vzorce Pi = 4*Atn(1). Některé posloupnosti vám ze začátku nebudou dávat smysl, chce to zkrátka představivost a praxi.

Nuly a jedničky

Nuly a jedničky (False/True) jsou doma v binární soustavě, kde mají svá kouzla a triky (posuny a nahazování bitu, AND .. „a současně“, tj. operace násobení, OR … „nebo, alespoň jeden z“, tj.  operace sčítání, XOR pro šifrování, Karnaughovy mapy aj.). I v naší desítkové soustavě se ale hodí základní úvahy.

0 … NEPRAVDA (False)
1 … PRAVDA (True), ve VBA bohužel True odpovídá hodnotě -1, ale to teď neřešme

Vezměme si slovní úlohu „Když je něco splněno (PRAVDA), pak číslo zahrň do výsledného součtu, jinak (NEPRAVDA) ho vypusť.“. V matematice (logice) je to ale přeci snadno řešitelné.

PRAVDA (1) * číslo = číslo
NEPRAVDA (0) * číslo = 0

Přenásobení jedničkou číslu neublíží, ani ho nezmění (toho se využívá i v dialogu Vložit jinak / Násobit pro „zamrzlá“ čísla chovající se jako text). V podmíněných výpočtech tak sčítáte čísla a nuly – typicky konstrukce maticového vzorce SUMA(KDYŽ(…)) nebo funkce SOUČIN.SKALÁRNÍ(). Pro převod pravdivostních hodnot na skutečná čísla se někdy uvádí dvojice znamének minus. Zápis — značí (-1)*(-1).

Při vymýšlení algoritmů si také uvědomte, jak se chová 0 a 1 coby exponent (A0=1, A1=A).

Úlohy typu každý n-tý

Tato zadání řeší lineární regrese – viz článek Efektivní procházení jednotlivých buněk v cyklu.

Dvouhodnotový přepínač

Dvouhodnotový přepínač se hodí v případě, že kupříkladu měníme velikost formuláře (UserForm). Kromě využití funkce (operátoru) MOD se podívejte ještě na techniky zmíněné ke konci článku Záměna obsahu proměnných.

Funkce ZVOLIT

Zapojte fantazii a podívejte se na využití funkce SIGN ve spojení s funkcí listu ZVOLIT:

=ZVOLIT(SIGN(číslo)+2;“záporné číslo“;“nula“;“kladné číslo“)

Všimněte si, že ZVOLIT zde nahrazuje otravné a nešikovné vnořování funkce KDYŽ (viz také články KDYŽ se řekne Excelu (1) a KDYŽ se řekne Excelu (2)).

Funkce (operátor) MOD

Tuto funkci považuji za matku všech algoritmů. Přitom umí jedinou věc – vrátí zbytek po dělení dvou čísel (mod = modulo). Má bratříčka v podobě funkce QUOTIENT. Ten se naopak stará o celou část při dělení. Do rodiny bych zařadil ještě ROUNDDOWN (viz Zaokrouhlování v Excelu).

Jak se dobrat správného vzorce, když máte jen na čísla posloupnosti na papíře? Dám vám tři tipy:

a) Zkopírujte čísla posloupnosti a předhoďte je vyhledávání na webu The On-Line Encyclopedia of Integer Sequences (OEIS). Mám tyhle stránky moc rád. Nedávno mě hledaná posloupnost 1, 2, 3, 4, 3, 2, 1, 2, 3, 4 třeba odkázala až na Pražský orloj. Je to zkrátka zábava.
b) Nemáte matematické nadání, naučenou teorii, praxi? Zadejte dotaz na Matematické fórum. Pokud se nejedená na první pohled o aritmetickou ani geometrickou posloupnost, nedaří se přijít na explicitní vyjádření, pak můžete zažít horké chvíle. A to nemluvím o stavu, kdy se do toho vloží pan Fourier :-)
c) I samotný Google vás nejednou nasměruje na stránky MATLABu, resp. báječného webu a nástrojů Wolfram Alpha (příklad trojúhelníkového průběhu níže). Někdo z vás si možná vybaví i programy jako Maple nebo Mathcad.

Na chvíli se u trojúhelníkového průběhu ještě zastavím. Pro nás se bude jednat o jakousi schodovitou funkci o n-schodech.

Trojúhelníkový průběh (Triangle Wave)
Trojúhelníkový průběh (Triangle Wave)

Vzorec, který slouží k dosažení hodnot, není úplně triviální. Na stránkách OEIS jsem univerzální řešení nenašel. Musím říct, že jsem k němu dospěl až po dvou hodinách studia materiálů z oblasti matematiky (trigonometrické funkce) a eletrotechniky (signály, viz pojmy jako sawtooth wave, triangle wave), a po nutné úpravě (symetrie, přenesení do kladných hodnot, posun na osách, práce s proměnnou představující počet schodů). Uff.

Ještě vás to baví? Jukněte na starší článek Zajímavé křivky dané parametricky. Já pro dnešek končím.