Wstęp do programowania / Ćwiczenia 2

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

To są ćwiczenia z rekurencji.

Zadanie 1 (Labirynt)

Czy istnieje droga miedzy wskazanymi punktami (x1,y1) i (x2,y2) w labiryncie reprezentowanym przez prostokątną tablicę liczb całkowitych A o rozmiarze n×m, zawierająca zera (droga) i jedynki (ściana)?

Wskazówka 1

Zadanie 2 (Z górki na pazurki)

W tablicy liczb całkowitych o rozmiarze n×m zapisana jest mapa gór (każdy punkt ma podaną dodatnią wysokość). Sprawdzić, czy da się przejść z punktu startowego do docelowego idąc:

  • tylko w dół lub po płaskim
  • tylko w dół

Wskazówka 1

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

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

Zadanie 5 (Mnożenie wielomianów stopnia n-1)

Dane są dwie tablice (array[0..n-1] of real) reprezentujące dwa wielomiany. 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. 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. Należy także zaprojektować odpowiedni typ danych do pamiętania symboli wejściowych.

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> {and <składnik>}
<składnik> <czynnik> {or <czynnik>}
<czynnik> true | false | not <czynnik> | <wyrażenie> <oprel> <wyrażenie> | ( <warunek> )
<wyrażenie> <zmienna> | <liczba>
<oprel> < | <= | > | >= | <> | =

Wskazówka 1