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>