Rekurencja w C++. Obliczanie n!
Problem:
Dla wczytanej liczby n oblicz n! w sposób iteracyjny i rekurencyjny.
Koduj sam, ale film może Ci pomóc zrozumieć ....
W poniższym filmie:
- definicja iteracyjna silni,
- przykładowe wartości,
- definicja rekurencyjna silni,
- kodowanie wersji iteracyjnej,
- kodowanie wersji rekurencyjnej,
- co, jeśli przekraczamy zakres int?
Do obejrzenia i przećwiczenia:
Kod, który powstał w filmie - wersja 1 (int):
W tej wersji wykorzystujemy do obliczeń typ int. Ponieważ dość szybko przekroczymy zakres tego typu, program w tej wersji policzy poprawnie wartości n! dla n<=12.
#include <iostream> #include <iomanip> using namespace std; //silnia iteracyjnie int silnia_I(int n){ int wynik=1, i; for(i=1; i<=n; i++) wynik=wynik*i; //lub: wynik*=i; return wynik; } //silnia rekurencyjnie int silnia_R(int n){ if(n==0) return 1; else return silnia_R(n-1)*n; } int main() { int n; cout << "podaj n: "; cin >> n; cout << "silnia iteracyjnie:\n"; for(int i=0; i<=n; i++) cout << i << "!=" << silnia_I(i) << endl; cout << "silnia rekurencyjnie:\n"; for(int i=0; i<=n; i++) cout << i << "!=" << silnia_R(i) << endl; return 0; }
Kod, który powstał w filmie - wersja 2 (long double):
W tej wersji wykorzystujemy do obliczeń "największy" dostępny w języku C++ typ zmiennoprzecinkowy long double. W programie jest tylko funkcja rekurencyjna i obliczanie tylko wartości n!
Maksymalnie jesteśmy w stanie policzyć 1754!
Dla n=1755 przekraczamy zakres typu long double.
inf - infinity - nieskończoność
#include <iostream> #include <iomanip> using namespace std; //silnia rekurencyjnie long double silnia_R(int n){ if(n==0) return 1; else return silnia_R(n-1)*n; } int main() { int n; cout << "podaj n: "; cin >> n; cout << "silnia rekurencyjnie:\n"; cout << n << "!=" << setprecision(5000) << silnia_R(n); return 0; }
Użycie kodu:
- Powyższy kod można wykorzystać w środowisku Dev C++ lub innym. Wystarczy utworzyć nowy projekt i wkleić ten kod zamiast istniejącego.
- Można też użyć kodu na jednej ze stron WWW z kompilatorami on-line, na przykład na stronie: www.cpp.sh