Изчисляване на факториел чрез итерация и рекурсия
Ще наричаме факториел от N произведението на всички естествени от интервала [1..N].
С факториел са свързани ред практически задачи. Примерно по колко различни начина могат да бъдат подредени N предмета.
Математическата функция факториел връща стойност 1, ако въведеното число N е 0 или 1.
Алгоритъм:
Инициализираме началната стойност на променливата факториел = 1.
В цикъл от 2 до N умножаваме получената до момента стойност с поредното число от цикъла.
След като цикъла приключи се извежда стойността на тази променлива - стойност на вече изчисления факториел от това число.
Една примерна задача за изчисляване на факториел би имала следното условие:
Да се състави програма за изчисляване на факториел по въведено число n: n*(n-1)*(n-2)*..*2*1.
Входни данни: естествено число от интервала [2 - 15].
Пример: 5 Изход: 120
Ще разгледаме задачата за изчисляване на факториел в два варианта: чрез итерация и чрез рекурсия.
Следващите две програми дават решена задача за изчисляване на факториел.
изчисляване на факториел чрез итерация
#include <iostream>
using namespace std;
long int have_fak_I( int chis ) //!!! long - mnogo byrzo narastwa stojnostta
{long fak=1;//nachalna inicializaciq
int i;
cout<<"Presmqtam s chislo : "<<chis<<endl;
for (i=1;i<=chis;i++)
{ fak*=i;
cout<<"Chislo : "<<i<<"! = "<<fak<<endl;
}
return fak;
}//kraj na funkciq factoriel
int main ()
{ int n;
cout<<"Da se systawi programa, izpolzwasha rekursiwna funkciq, koqto\n";
cout<<"izwevda faktoriel na wywedeno chislo n! = n*(n-1)*(n-2)*..*2*1.\n";
cout<<"Whodni danni: estestweno chislo ot interwala [3..15].\n";
cout<<"Primer: 5 Izhod 120.\n";
cout<<"Wywedete estestweno chislo ot interwala [3..15]: "; cin>>n;
cout<<"Poluchenata chislo za factoriel "<<n<<"! e: "<<have_fak_I(n)<<endl;
system("pause");//chaka natiskane na klawish
return 0;//osbovdawa zaetite sistemni resursi i wrysha kod na greshka 0
}//kraj na programa factoriel
Начало на страницата
изчисляване на факториел чрез рекурсия
#include <iostream>
using namespace std;
long int have_fak_R( int chis ) //!!! long - mnogo byrzo narastwa stojnostta
{//tqlo na rekursiwnata funkciq - stojnostta na faktoriela raste byrzo
cout<<"Presmqtam s chislo : "<<chis<<endl;
if ( chis > 1 )
{return have_fak_R( chis-1 )*chis;
//rekursiwno izwikwane, no s chislo s 1 po-malko ot tekushoto
}
else { return 1; // dyno na rekursiata factoriel 0 = 1
}
}//kraj na rekursiwnata funkciq factoriel
int main ()
{ int n;
cout<<"Da se systawi programa, izpolzwasha rekursiwna funkciq, koqto\n";
cout<<"izwevda faktoriela na wywedeno chislo n! = n*(n-1)*(n-2)*..*2*1.\n";
cout<<"Whodni danni: estestweno chislo ot interwala [3..15].\n";
cout<<"Primer: 5 Izhod 120.\n";
cout<<"Wywedete estestweno chislo ot interwala [3..15]: "; cin>>n;
cout<<"Poluchenata chislo za factoriel "<<n<<"! e: "<<have_fak_R(n)<<endl;
system("pause");//chaka natiskane na klawish
return 0;//osbovdawa zaetite sistemni resursi i wrysha kod na greshka 0
}//kraj na programa factoriel
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.