<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/screen.xsl" media="screen"?>
<lecture>

<meta>
  <maintitle>Karel</maintitle>
  <author>Jiří Znamenáček</author>
  <title>Pascalův trojúhelník</title>
  <date>2026-10-01</date>
  <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
</meta>
<!--
  „“–
  ↵ aneb &#x21B5; aneb \r aneb CR aneb CarriageReturn
-->


<slide title="Úvod">

    <p>
        Rekurze se dá použít na mnoha místech. V této přednášce si s její pomocí nakreslíme <strong>Pascalův trojúhelník.</strong> Číselně vypadá takto..
    </p>
    <pre>
                                                1
                                              1   1
                                            1   2   1
                                          1   3   3   1
                                        1   4   6   4   1
                                      .....................
                                    .........................    </pre>
    <p>
        ..ale náš Karel samozřejmě neumí do města zapisovat čísla, takže místo nich položíme příslušný počet značek:
    </p>
    <img src="_files/pascal/pascal.jpg" width="433" height="248" alt="Pascalův trojúhelník" />
    <note>
        Připraveno podle publikace: <cite>Vejvoda, Michal; Rytíř, Miroslav: „Programovací jazyk KAREL“. Český Krumlov, 1987-2001.</cite>
    </note>

</slide>
<slide title="Jak na to?">

    <p>
        Princip tvorby <em>Pascalova trojúhelníku</em> je jednoduchý: Každý prvek od druhé hladiny (ta s dvěma jedničkami) níž vznikne součtem dvou prvků nad sebou. Kromě krajních, které nad sebou mají pouze jeden prvek a to právě jedničku. Ale jak na to v Karlovi? Jak jinak než rekurzí ^_~
    </p>
    <p>
        Začneme nejjednodušším možným tvarem – Karel stojí otočený směrem na jih přímo před zdí. V takové situaci může položit pouze jednu značku (vrchní jednička) a skončí. Pokud by stál o řádku od zdi výše, kromě této jedné značky by položil ještě dvě další – jednu šikmo dolů vlevo a druhou šikmo dolů vpravo (dvě jedničky ve druhé řadě). Třetí řada by vznikla položením dvou značek stejnými směry ze dvou jedniček v řadě druhé, čímž by ovšem uprostřed skončily značky dvě – jedna z levé jedničky, druhá z té pravé. A tak dál.
    </p>
    <p>
        Jinak řečeno – v každém místě, pokud už nebude stát před zdí, položí Karel šikmo pod sebe dvě značky. Načež na tyto dvě postupně sejde a z obou se pokusí vykonat to samé (tedy položit dvě značky šikmo pod dané místo). Už tam vidíte tu rekurzi? ^_^
    </p>

</slide>
<slide title="Program I">

    <p>
        Napišme si rovnou konečnou proceduru pro sestavení Pascalova trojúhelníku, přičemž chybějící příkazy doplníme později. Z důvodů přehlednosti a symetrie přitom necháme Karla po sestupu na nižší hladinu vždy vrátit na původní políčko o hladinu výše:
    </p>
    <example lang="karel">
        PASCAL
          NA JIH
          POLOŽ
          KDYŽ NENÍ ZEĎ
            NA LEVÝ PODSTROM
            PASCAL
            ZPÁTKY Z LEVÉHO PODSTROMU
            NA PRAVÝ PODSTROM
            PASCAL
            ZPÁTKY Z PRAVÉHO PODSTROMU
          KONEC
        KONEC
    </example>
    <p>
        Postup tvorby Pascalova trojhúhelníku je jasný:
    </p>
    <ol>
        <li>
            Na výchozím políčku se Karel otočí na jih a položí značku.
        </li>
        <li>
            Pokud nebude stát před zdí, může začít stavět levý a pravý podstrom na druhé úrovni.
        </li>
        <li>
            Nejdříve sejde šikmo dolů vlevo, načež rekurzivně zavolá stavbu stejného stromu z tohoto místa.
        </li>
        <li>
            Až levý podstrom (rekurzivně) dostaví, vrátí se na výchozí políčko o úroveň výš.
        </li>
        <li>
            Následně sestoupí šikmo dolů vpravo a začne rekurzivně stavět pravý podstrom.
        </li>
        <li>
            Až ho dostaví, vrátí se z něj opět o úroveň výš na výchozí pole tohoto podstromu.
        </li>
    </ol>

</slide>
<slide title="Program II">

    <p>
        Aby předchozí procedura fungovala, musíme doplnit chybějící příkazy pro přesun. Nejdříve příkazy pro přechod na levý podstrom a návrat z něj..
    </p>
    <example lang="karel">
        NA LEVÝ PODSTROM
          NA JIH
          KROK
          VPRAVO VBOK
          KROK
        KONEC

        ZPÁTKY Z LEVÉHO PODSTROMU
          NA VÝCHOD
          KROK
          VLEVO VBOK
          KROK
        KONEC
    </example>
    <p>
        ..a pak příkazy pro přechod na pravý podstrom a návrat z něj:
    </p>
    <example lang="karel">
        NA PRAVÝ PODSTROM
          NA JIH
          KROK
          VLEVO VBOK
          KROK
        KONEC

        ZPÁTKY Z PRAVÉHO PODSTROMU
          NA ZÁPAD
          KROK
          VPRAVO VBOK
          KROK
        KONEC
    </example>

</slide>
<slide title="Program III">

    <p>
        Ještě nám zbývají příkazy pro natočení správným směrem:
    </p>
    <example lang="karel">
        NA JIH
          RYCHLE
            DOKUD NENÍ JIH
              VLEVO VBOK
            KONEC
          POMALU
        KONEC

        NA VÝCHOD
          RYCHLE
            DOKUD NENÍ VÝCHOD
              VLEVO VBOK
            KONEC
          POMALU
        KONEC

        NA ZÁPAD
          RYCHLE
            DOKUD NENÍ ZÁPAD
              VLEVO VBOK
            KONEC
          POMALU
        KONEC

        NA SEVER
          RYCHLE
            DOKUD NENÍ SEVER
              VLEVO VBOK
            KONEC
          POMALU
        KONEC

        VPRAVO VBOK
          RYCHLE
            VLEVO VBOK
            VLEVO VBOK
            VLEVO VBOK
          POMALU
        KONEC
    </example>
    <note>
        Příkaz <code>NA SEVER</code> jsme sice nutně nepotřebovali, protože z každého místa jsme po prvním nasměrování už přesně věděli kam jít a kam se otáčet, ale stejně dobře jsme mohli některá otočení vlevo a vpravo nahradit právě jím.
    </note>

</slide>
<slide title="Poznámka">

    <p>
        Pokud Karla na začátku postavíte tak nešikovně, že dorazí k nějaké krajní stěně dřív, než bude na poslední řádce města, podle výše uvedeného programu nabourá. Snažit se to opravit by ho zbytečně zneprůhlednilo, takže ho prostě na začátku postavte doprostřed dolů, nebo níž.
    </p>

</slide>


</lecture>
