8. Silnia - Interklasa
Transkrypt
8. Silnia - Interklasa
Silnia Symbol n! (czytany jako „n silnia”) oznacza iloczyn kolejnych liczb naturalnych od 1 do n: n! = 1 ⋅ 2 ⋅ … ⋅ n Przyjmujemy, że 0! = 1. Powyższa definicja jest definicją iteracyjną, gdyż jej istota polega na powtarzaniu mnożenia przez kolejne liczby naturalne. Silnie można również zdefiniować rekurencyjnie, przez odwołanie się do jej wartości dla mniejszej liczby: n! = n ⋅ (n − 1)! 0! = 1 Zauważmy, że przy rekurencyjnej wersji definicji konieczny jest dodatkowy warunek: jawne określenie wartości funkcji dla pewnej „początkowej” liczby (tutaj dla zera). Użytkownik wprowadza liczbę naturalną n. Podaj rekurencyjny algorytm funkcji silnia(n) obliczającej wartość n! . (Np.: dla liczby 5 program powinien zwrócić liczbę 120 (ponieważ 5! = 1 ⋅ 2 ⋅ 3 ⋅ 4 ⋅ 5 = 120).) Specyfikacja funkcji silnia(n): liczba naturalna n Argumenty: Zwracana wartość: liczba naturalna – wartość n! a) Przedstaw ten algorytm w formie opisu kolejnych kroków. b) Zaprezentuj ten algorytm w formie schematu blokowego. c) Napisz program realizujący ten algorytm w wybranym przez siebie języku programowania (Pascal, C lub C++). Oto przykład działania takiego programu: Podaj liczbę naturalną: 5 5! = 120 d) Zaimplementuj ten algorytm w formie programu w języku Visual Basic lub skryptu w języku JavaScript. Oto przykładowy projekt takiej aplikacji: Przykładowe rozwiązanie Algorytm rekurencyjny wymaga użycia funkcji (podprogramu), gdyż odwołuje się on sam do siebie. Zadaniem tej funkcji będzie jedynie obliczenie zadanej wartości (tutaj: silni). Instrukcje pobierania danych i wypisywania wyniku umieścimy w głównej (nadrzędnej) części algorytmu (programu). Opis kolejnych kroków – pkt a) Krok 1: Jeśli liczba n jest równa 0, zwróć wartość 1. W przeciwnym razie przejdź do następnego kroku. Krok 2: Zwróć wartość iloczynu n · silnia(n – 1). Schemat blokowy – pkt b) Funkcja silnia(n) NIE n=0 ? Zwróć n · silnia(n-1) TAK Zwróć 1 Program w języku Pascal – pkt c) program SilniaRekurencyjna; { Obliczanie wartości silni } function silnia(n: longint): longint; begin if n=0 then begin silnia := 1; exit end; silnia := n * silnia(n-1) end; var k: longint; begin write('Podaj liczbę naturalną: '); read(k); writeln(k, '! = ', silnia(k)) end. Uwaga: Wartości silni już dla niewielkich argumentów są bardzo duże, stąd użycie typu longint zamiast zwykłego typu integer. Program w języku C++ – pkt c) // Obliczanie wartości silni #include <iostream> int silnia(int n) { if(n==0) return 1; return n * silnia(n-1); } main() { cout << "Podaj liczbę naturalną: "; int k; cin >> k; cout << k << "! = " << silnia(k) << endl; } Program w języku Visual Basic – pkt d) Pole tekstowe, na którym użytkownik wpisuje liczbę naturalną, jest oznaczone jako Text1. Przycisk uruchamiający procedurę znajdowania największej liczby jest oznaczony jako Command1. Pole tekstowe, na którym wyświetlany jest rezultat wyszukiwania, jest oznaczone jako Text2. Oto procedura stowarzyszona z przyciskiem Command1: Private Sub Command1_Click() Dim n n = Val(Text1.Text) Text2.Text = Silnia(n) End Sub A tak wygląda sama funkcja Silnia: Function Silnia(n) If n = 0 Then Silnia = 1 Else Silnia = n * Silnia(n - 1) End If End Function Program w języku JavaScript – pkt d) Prezentujemy kompletny kod HTML strony WWW będącej rozwiązaniem zadania: <html> <head> <script language=javascript> function silnia(n) { if(n==0) return 1; return n * silnia(n-1); } function oblicz() { var n = eval(document.f1.n.value); document.f1.wynik.value = silnia(n); } </script> </head> <body> <h1 align=center>Silnia</h1> <form name=f1> <center> Podaj liczbę naturalną: <br> <input type=text size=10 name=n> <br><br> <input type=button value=Oblicz onClick=oblicz()> <br><br> Silnia: <br> <input type=text size=20 name=wynik> <br> </center> </form> </body> </html>