Rekurencja w C++. Obliczanie n!

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!
1754!
Dla n=1755 przekraczamy zakres typu long double.
1755!
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