Zdefiniuj procedurę z dwoma parametrami TROJKI :zakres :suma, której wywołanie powoduje wypisanie w kolejnych wierszach wszystkich trójek liczb całkowitych dodatnich a b c, nie większych niż dana wartość :zakres, takich że: a < b < c oraz a + b + c =:suma. Oto przykładowe działanie procedury:
TROJKI 6 10 | TROJKI 7 12 |
---|---|
powinno wypisać na ekranie: | powinno wypisać na ekranie: |
1 3 6 | 1 4 7 |
1 4 5 | 1 5 6 |
2 3 5 | 2 3 7 |
2 4 6 | |
3 4 5 |
Przed przystąpieniem do zadania warto stwierdzić jakie warunki muszą spełanić liczby. Wiadomo, że , dlatego , ponieważ jeśli a będzie większe to wtedy wszystkie lub tylko b i c musiałyby być równe. Wiadomo też, że b jest większe od a, ale nigdy nie jest równe :zakres, czyli . Ostatnia liczba c musi być większy od b, dlatego należy do zakresu . Tego typu rozwiązanie realizuje poniższy kod:
(2.) Dla każdej wartości a: (3.) zapamiętujemy jej wartość i (4.) w zależności od a sprawdzamy odpowiedni wartości b: (5.) obliczamy wartość b oraz (6.) ile musi wynieść c. (7.) Jeśli c > b to (8.) to wypisujemy wyliczoną trójke. Nie trzeba sprawdzać czy a < b, ponieważ jest to zagwarantowane przez zakresy.
Liczbę c można wyznaczyć w ten sam sposób jak b. Jednak sprawdzanie wszystkich możliwości zmniejsza efektywność algorytmu.
Zdefiniuj funkcję z jednym parametrem MOS :wyraz, której wartością dla danego wyrazu jest liczba liter zawartych między najbardziej odległymi samogłoskami w tym wyrazie, lub -1 w przypadku gdy wyraz nie zawiera przynajmniej dwóch samogłosek. Zakładamy, że wyrazy zawierają jedynie małe litery alfabetu łacińskiego. Oto przykładowe wyniki:
MOS "hokus | ma wartość 1 |
---|---|
MOS "nic | ma wartość -1 |
MOS "abrakadabra | ma wartość 9 |
Do rozwiązania zadania warto zadeklarować dodatkową funkcję SAMOGŁOSKA?, która będzie przyjmowała znak. Zwrócona wartość określi czy dany znak jest samogłoską:
Zadanie można wyznaczyć sprawdzając kolejne znaki. Jeśli napotkamy samogłoskę należy ją przypisać indeksowi pierwszemu, a jeśli znajdziemy następną to przypisujemy ją tylko do drugiego indeksu. Różnica indeksu będzie szukaną wartością.
Ustalanie indeksów początkowych (2.) :p - indeks pierwszej samogłoski i (3.) :o - indeks ostatniej samogłoski. (4.) Dla każdej litery z :wyraz: (5.) sprawdza czy litera jest samogłoską. Jeśli jest to należy sprawdzić (6.) czy jest to pierwsza samogłoska, czyli czy :p = 0. Jeśli drugi warunek też jest spełniony to (7.) ustalamy :p na aktualny indeks litery. Jednak jeśli nie jest to pierwsza samogłoska to zmieniamy drugi indeks :o. Po pętli pozostaje (13.) zinterpretować wynik. Jeśli :o = 0 to (14.) należy zwrócić wynik -1, ponieważ nie ma lub jest tylko jedna samogłoska. W przeciwnym wypadku (16.) należy zwrócić różnicę pomiędzy :o i :p. Wartość tę należy jeszcze zmniejszyć o jeden.
Z trzech identycznych kwadratów można ułożyć figurę o kształcie litery L, taką jak na rysunku a. Takie samo L można utworzyć:
z 4 dwa razy mniejszych L - ja na rysunku b,
z 16 cztery razy mniejszych L - jak na rysunku c, itd.
Każde kolejne L jest coraz bardziej złożone. Przyjmijmy, że:
Najprostsze rozwiązanie tego zadania opiera się o rekurencję. Wystarczy bowiem napisać funkcję rysującą L, a następnie, aby w odpowiednich punktach narysować L o mniejszym stopniu złożoności. Punkty zostały zaznaczone na poniższym schemacie:
(2.) Wywołanie L o mniejszym stopniu złożoności. (3. - 4.) Przejście do górnego punktu. (5.) Ponowne wywołanie funkcji. (6. - 9.) Przejście w prawo i w dół. (10. - 22.) Wywołanie mniejszego L w punkcie pośrodku ekranu. (23. - 26.) Przejście do prawego dolnego rogu i (27.) ponowne wywołanie funkcji o mniejszym stopniu złożoności. (28 - 29.) Zakończenie rysowania L i ustawienie żółwia w pozycji początkowej.
Pozostaje napisać teraz właściwą procedurę :L, która wywoła L_rek, a wcześniej określi wymiary rysunku: