W PRZYPADKU DUŻYCH PROBLEMÓW

Jak widzieliśmy, nie zawsze uogólniamy cały problem zresztą nie zawsze jest to możliwe, szczególnie w przypadku dużych, złożonych pro­blemów. Często wystarcza’uogólnić fragment oryginalnego problemu, tak jak w naszym przykładzie. Przykład ten ilustrował jeszcze jedną technikę rozwiązywania problemów — podziału na’podproblemy prostsze do roz­wiązania. Wyznaczenie odpowiedzi na każdy z podproblemów daje w su­mie rozwiązanie całego problemu.Technika, czy raczej strategia rozwiązywania problemów, którą tu nazwaliśmy „podziałem na podproblemy”, jest najważniejszą i najbardziej przydatną strategią zarówno w definiowaniu problemów, pisaniu progra­mów, projektowaniu dużych systemów informatycznych, jak i w życiu codziennym. Człowiek w naturalny sposób z niej korzysta, najczęściej w sposób nieuświadomiony.

ŁATWE DO SPRAWDZENIA

Nasz oryginalny’ problem’ sprowadziliśmy więc do’ rozwiązania dwóch problemów: skonstruowania listy studentów, co robimy za pomocą relacji, lista, oraz wyznaczenia długości tak zbudowanej , listy,’czego jeszcze nie umiemy zrobić. Wyznaczenie-‚długości listy jest sprawą łatwą. Lista pusta ma oczywiście długość 0. Długość dowolnej niepustej listy to długość reszty tej listy plus 1. Możemy to zapisać w następujący sposób, przyjmując, że pierw­szym argumentem relacji’„długość” jest lista, a drugim: liczba będąca długością tej listy. Jak  łatwo sprawdzić, jest to poprawna definicja rekursyjna, gdyż pierwszy argument definiowanej relacji długość po prawej stronie sym­bolu „jeśli” jest mniejszy, bo pozbawiony pierwszego elementu X, w sto­sunku do analogicznego argumentu w nagłówku tej reguły.

ODPOWIEDŹ NA PYTANIE

Załóżmy, że interesuje nas odpowiedź na pytanie: ilu studentów jest w naszej przykładowej grupie? Jest to oczywiście problem jednostkowy. -Łatwo’możemy znaleźć problemy o’podobnej strukturze,’np. ile elemen­tów zawiera lista;.[1. 2,3]? Ponieważ, mamy prawo przypuszczać, że po­dobne problemy będą pojawiały się dosyć często w różnych zagadnieniach, warto zamiast naszego, problemu- jednostkowego sformułować problem ogólny. Czy tak sformułowany problem ogólny obejmuje nasze pytanie jako ‚przypadek’ szczególny? To zależy, jakimi informacjami o naszej grupie dysponujemy. Jeżeli znamy tylko, jak poprzednio, fakty to aby móc-skorzystać z programu ogólnego,-musimy umieć -zbudować listę nazwisk studentów — w- problemie: ogólnym zliczamy bowiem ele­menty listy, a nie ile jest faktów. Pamiętamy jednak, że odpowiednią listę możemy skonstruować za pomocą’: relacji „lista”.

PARAMETRYZACJA

Listy w tych problemach są co prawda różnej długości, raz 3-, raz 4-elementowe, jednak notacja pierwszy-reszta pozwala nam na zapis listy dowolnej długości. Rekursja pozwala natomiast na uniezależ­nienie sposobu rozwiązania problemu od długości listy, chętnie więc z niej w tym celu korzystamy. Parametryzacja w naszym przypadku sprowadzała się do użycia w den- nicji relacji „element” nie argumentów stałych, lecz zmiennych. W przy­padku listy posłużyliśmy się niejako podwójną zmienną, korzystając z notacji pierwszy-reszta. Parametryzacji używaliśmy ^ już zresztą wcze­śniej, np. w definicjach relacji „niższy-od” oraz „silnia .Zwróćmy uwagę na jeszcze jedną, zapewne już całkiem oczywistą rzecz. Parokrotne użycie tego samego symbolu jako zmiennej w tym samym zdaniu definicji relacji, jak np. dwukrotne użycie X .

JEDNA Z WAŻNIEJSZYCH UMIEJĘTNOŚCI

Rozwiązanie tego problemu w postaci definicji relacji czy programu, wszystko jedno w jakim języku programowania, służyć nam może tylko dla tego konkretnego jednostkowego przypadku. Problem w sformułowaniu takim, jaki podaliśmy wyżej, możemy nazwać problemem ogólnym. Nasze sformułowanie wydaje się być najogólniejsze z możliwych. Obejmuje wszystkie możliwe przypadki jednostkowe, w tym przypadek, gdy obiektem i listą nas interesującą jest Kowalski i lista nazwisk studentów. Jedną z ważniejszych umiejętności w informatyce jest umiejętność uogólniania problemów, tak aby za pomocą tego samego programu można było rozwiązywać wiele problemów jednostkowych, będących szczególnymi przypadkami problemu ogólnego. Jeżeli kilkanaście powyższych zdań Czy­telnik uważał za rzecz zupełnie oczywistą, to ma zadatki na niezłego informatyka.