Obliczanie wartości potęgi o podstawie i wykładniku naturalnym

Specyfikacja problemu:

Dane:

  • p – podstawa potęgi; liczba naturalna, p > 0

  • w – wykładnik potęgi; liczba naturalna

Wynik:

  • wynik – wynik potęgowania; liczba naturalna

Sposób iteracyjny

Napiszemy funkcję obliczającą wartość potęgi o wykładniku naturalnym. Zaczniemy od nadania jej nazwy. Będziemy również potrzebować dwóch parametrówparametr funkcjiparametrów – jeden z nich będzie odpowiadać za wartość podstawy, a drugi za wartość wykładnika. Nazwiemy je odpowiednio p i w. Obu parametrom nadamy typ int.

Linia 1. int iteracja otwórz nawias okrągły int p przecinek int w zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. zamknij nawias klamrowy.

Teraz w ciele funkcji zadeklarujemy zmienną wynik o typie całkowitym. Przypiszemy jej wartość: 1. Następnie utworzymy pętlę while, która będzie wykonywana, dopóki w jest większe od zera.

Linia 1. int wynik znak równości 1 średnik. Linia 2. while otwórz nawias okrągły w zamknij nawias ostrokątny 0 zamknij nawias okrągły. Linia 3. otwórz nawias klamrowy. Linia 4. zamknij nawias klamrowy.

W środku pętli będziemy mnożyć zmienną wynik przez p, a następnie dekrementowaćdekrementacjadekrementować zmienną w.

Linia 1. wynik asterysk znak równości p średnik. Linia 2. w minus minus średnik.

Skoro w zmiennej wynik mamy już wyliczoną odpowiednią wartość, możemy ją zwrócić.

Linia 1. return wynik średnik.

W ten sposób udało się nam napisać funkcję potęgującą sposobem iteracyjnym.

Gotowa funkcja wygląda następująco:

Linia 1. int iteracja otwórz nawias okrągły int p przecinek int w zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. int wynik znak równości 1 średnik. Linia 4. while otwórz nawias okrągły w zamknij nawias ostrokątny 0 zamknij nawias okrągły. Linia 5. otwórz nawias klamrowy. Linia 6. wynik asterysk znak równości p średnik. Linia 7. w minus minus średnik. Linia 8. zamknij nawias klamrowy. Linia 9. return wynik średnik. Linia 10. zamknij nawias klamrowy.

Sposób rekurencyjny

Napiszmy funkcję obliczającą wartość potęgi metodą rekurencyjną. Funkcja będzie miała dwa parametry typu int, przechowujące informacje: podstawę i wykładnik potęgi. Nazwiemy je odpowiednio p i w.

Linia 1. int rekurencja otwórz nawias okrągły int p przecinek int w zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. zamknij nawias klamrowy.

We wnętrzu funkcji rozważymy dwa przypadki. Pierwszy to warunek przerywania rekurencji (warunek podstawowy), który zwróci wartość i zakończy wykonywanie funkcji. Do jego zdefiniowania użyjemy instrukcji warunkowej if, gdzie w teście logicznym sprawdzimy, czy zmienna w jest równa 0. W sytuacji, gdy taka zależność będzie zachodzić, funkcja zwróci 1. W pozostałych przypadkach funkcja zwróci iloczyn zmiennej p i siebie samej z argumentami p i w - 1.

Linia 1. if otwórz nawias okrągły w znak równości znak równości 0 zamknij nawias okrągły return 1 średnik. Linia 2. else return p asterysk rekurencja otwórz nawias okrągły p przecinek w minus 1 zamknij nawias okrągły średnik.

Tym sposobem napisaliśmy funkcję potęgującą z wykorzystaniem rekurencji.

Linia 1. int rekurencja otwórz nawias okrągły int p przecinek int w zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. if otwórz nawias okrągły w znak równości znak równości 0 zamknij nawias okrągły return 1 średnik. Linia 4. else return p asterysk rekurencja otwórz nawias okrągły p przecinek w minus 1 zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

Jak możemy łatwo zauważyć, wymagała ona napisania znacznie krótszego kodu w porównaniu do wariantu iteracyjnego.

Dla pełnego zrozumienia sposobu działania funkcji rekurencyjnej przeanalizujemy działanie tej funkcji dla podstawy równej 2 i wykładnika o wartości 3.

  1. Zaczynamy ze zmienną p = 2w = 3. Ponieważ w nie jest równe 0, wywołujemy p * rekurencja (p, w - 1), czyli 2 * rekurencja (2, 2).

  2. W wywołaniu funkcji rekurencja (2, 2), w dalszym ciągu w nie równa się 0, więc ponownie wywołujemy funkcję: 2 * rekurencja (2, 1).

  3. W przypadku wywołania funkcji rekurencja (2, 1), w nadal nie równa się 0, wywołujemy zatem po raz ostatni funkcję – tym razem będzie to 2 * rekurencja (2, 0).

Funkcja rekurencja (2, 0) zwróci nam wartość 1. Teraz, gdy mamy już wartość z warunku podstawowego (początkowego), możemy obliczyć wszystkie użyte wywołania funkcji potęga. Składają się one razem na odpowiedź na zadane pytanie o wartość liczby 2 podniesionej do potęgi 3.

  1. rekurencja (2, 1) to 2 * rekurencja (2, 0), czyli 2.

  2. rekurencja (2, 2) to 2 * rekurencja (2, 1), czyli 4.

  3. rekurencja (2, 3) to 2 * rekurencja (2, 2), czyli 8.

Tym samym udało nam się przeanalizować działanie funkcji rekurencyjnej rekurencja oraz otrzymać poprawny wynik, czyli 8.

Obliczanie silni

Specyfikacja problemu:

Dane:

  • liczba – liczba naturalna

Wynik:

  • silnia – iloczyn liczb od 1 do liczba; liczba naturalna

Sposób iteracyjny

Linia 1. int silnia podkreślnik iteracyjna otwórz nawias okrągły int liczba zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. long long silnia znak równości 1 średnik. Linia 5. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości liczba średnik i plus plus zamknij nawias okrągły. Linia 7. silnia asterysk znak równości i średnik. Linia 9. return silnia średnik. Linia 10. zamknij nawias klamrowy.

Sposób rekurencyjny

Linia 1. int silnia podkreślnik rekurencyjna otwórz nawias okrągły int liczba zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. if otwórz nawias okrągły liczba otwórz nawias ostrokątny 2 zamknij nawias okrągły. Linia 4. otwórz nawias klamrowy. Linia 5. return 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 7. return liczba asterysk silnia podkreślnik rekurencyjna otwórz nawias okrągły liczba minus 1 zamknij nawias okrągły średnik. Linia 8. zamknij nawias klamrowy.

Słownik

argument funkcji
argument funkcji

element składni w określonym języku programowania, który w wyniku wywołania podprogramu zostaje utożsamiony (skojarzony) z określonym parametrem podprogramu

dekrementacja
dekrementacja

zmniejszenie wartości zmiennej o jeden

iteracja
iteracja

powtarzanie tej samej operacji określoną liczbę razy lub do momentu, w którym zadany warunek zostanie spełniony

parametr funkcji
parametr funkcji

element składni w określonym języku programowania; umożliwia komunikację  między podprogramem (funkcją) wywołanym a programem wywołującym; parametry określa się w nagłówku podprogramu (przy jego definicji)

rekurencja
rekurencja

technika programowania polegająca na odwoływaniu się procedur lub funkcji do samych siebie, aż do momentu spełnienia warunku podstawowego

stos
stos

liniowa struktura danych, której dane są pobierane zgodnie z zasadą LIFO (od ang. Last‑In First‑Out - dane dołączone jako ostatnie są pobierane jako pierwsze)

warunek początkowy (podstawowy)
warunek początkowy (podstawowy)

warunek, który spełniony nie spowoduje wywołania funkcji rekurencyjnej, tylko zwróci konkretną wartość