Wstęp do programowania / Ćwiczenia 2
To są ćwiczenia z rekurencji.
Zadanie 1 (Labirynt)
Czy istnieje ścieżka miedzy wskazanymi punktami (i1,j1) i (i2,j2) w labiryncie reprezentowanym przez prostokątną tablicę liczb całkowitych o rozmiarze M×N, zawierającą zera (ściana) i jedynki (droga)? Zakładamy, że nie można przechodzić z pola na pole po skosie (np. z (2,5) na (3,6)), a tylko w czterech podstawowych kierunkach (np. z (2,5) na (3,5), (2,4) itd.)
Wskazówka 1
Rozwiązanie 1
Pytanko 1:
Pytanko 2:
Pytanko 3: (trudniejsze)
Odpowiedź:
Dla ciekawskich:
Zadanie 2 (Z górki na pazurki)
W tablicy liczb całkowitych o rozmiarze M×N zapisana jest mapa gór (każdy punkt ma podaną dodatnią wysokość). Sprawdzić, czy da się przejść z punktu startowego (i1,j1) do docelowego (i2,j2) idąc:
- tylko w dół lub po płaskim
- tylko w dół
Tak jak w poprzednim zadaniu poruszać się można tylko w czterech kierunkach podstawowych, nie po przekątnej.
Wskazówka 1
Rozwiązanie 1
Rozwiązanie 2
Zadanie 3 (Wieże Hanoi z ograniczeniami)
Na wykładzie były wieże Hanoi. Ciekawa modyfikacja tego zadania polega na zabronieniu ruchów pomiędzy niektórymi pałeczkami, np. z pierwszej na drugą. Zapisać procedurę realizującą to zadanie przy zabronionych niektórych ruchach.
Wskazówka 1
Rozwiązanie 1
Pytanko 1
Odpowiedź
Zadanie 4 (Ustawianie hetmanów)
Napisz procedurę znajdująca wszystkie takie rozstawienia 8 hetmanów na szachownicy, by żadne dwa hetmany się nie atakowały.
Wskazówka 1
Rozwiązanie 1
Zadanie 5 (Mnożenie wielomianów)
Dane są dwie tablice (array[0..N-1] of real) reprezentujące dwa wielomiany stopnia N-1. Należy obliczyć iloczyn tych wielomianów metodą dziel-i-zwyciężaj. Zakładamy, że N jest potęgą dwójki.
Wskazówka 1
Zadanie 6 (Parser)
Dla zadanej poniżej gramatyki języka programowania (będącego uproszczoną wersją Pascala) napisz metodą zejść rekurencyjnych zestaw procedur weryfikujących poprawność programów zapisanych w tym języku. Należy sprawdzić poprawność programu względem podanej gramatyki oraz czy wszystkie zmienne występujące w programie są zadeklarowane i czy wszystkie zadeklarowane zmienne są użyte. Można założyć, że w całym programie nie wystąpi więcej niż Z zmiennych. W przypadku napotkania błędu należy wypisać stosowny komunikat i zakończyć działanie. Należy założyć istnienie procedury GetSym(Symbol), która daje kolejny symbol (identyfikator, liczbę, operator (:=,<,>,<=,>=,=,<>), separator (;, ., (, ) ) z wejścia.
Gramatyka: W opisie gramatyki występują następujące symbole:
<nieterminal> | |
terminal | |
{ coś } | wielokrotne (być może 0-krotne) wystąpienie cosia |
→ | rozdziela lewą część produkcji od prawej |
| | rozdziela poszczególne produkcje |
Jest to trochę rozszerzona (o nawiasy klamrowe { } ) gramatyka bezkontekstowa.
<program> | → | <deklaracja> begin <ciąg instrukcji> end . |
<ciąg instrukcji> | → | <instrukcja> { ; <instrukcja> } |
<deklaracja> | → | var <zmienna> { , <zmienna> } ; |
<instrukcja> | → | while <warunek> do <instrukcja> |
| if <warunek> then <instrukcja> else <instrukcja> | ||
| begin <ciąg instrukcji> end | ||
| <zmienna> := <wyrażenie> | ||
<warunek> | → | <składnik> {or <składnik>} |
<składnik> | → | <czynnik> {and <czynnik>} |
<czynnik> | → | true | false | not <czynnik> | <wyrażenie> <oprel> <wyrażenie> | ( <warunek> ) |
<wyrażenie> | → | <zmienna> | <liczba> |
<oprel> | → | < | <= | > | >= | <> | = |
<zmienna> | → | ciąg liter |
<liczba> | → | ciąg cyfr |
Wskazówka 1