Консультация № 144932
24.09.2008, 21:13
0.00 руб.
0 9 4
Здравствуйте ещё раз. Помогите пожалуйста написать программу для подсчета факториала введённого значения на основе рекурсивной функции. Спасибо.

Обсуждение

Неизвестный
24.09.2008, 21:24
общий
24.09.2008, 21:41
это ответ
Здравствуйте, Валуев Александр Михайлович

вот, рекурсивная форма:


Приложение:
#include <iostream>

unsigned long fact(unsigned n)
{
if(n == 1)
return 1;
return n * fact(n - 1);
}

void main(int argc, char* argv[])
{
unsigned n = 0;
while(n == 0 || n > 30){
std::cout << "Input n, n < 30\n n = ";
std::cin >> n;
}

std::cout << n << "! = " << fact(n);
}
Неизвестный
24.09.2008, 21:36
общий
24.09.2008, 21:42
это ответ
Здравствуйте, Visual Scooby!

Код С++ программы с комментариями в приложении.

Удачи!

Приложение:
//Подключаем заголовок потокового ввода/вывода
#include <iostream>

using namespace std;

//Объявляем прототип функции "fact_rekurs"
long int fact_rekurs(int n);

int main ()
{
//Объявляем переменную целого типа
int n = 0;

//Приглашение ввести значение
cout << " Vvedyte znachenye: ";

//Ввод значения
cin >> n;

//Вывод результата с вызовом функции "fact_rekurs" с переменной n в качестве аргумента
cout << endl << " Factoryal chysla " << n << " = " << fact_rekurs(n) << endl << endl;

return 0;
}

//Описание работы функции "fact_rekurs"
long int fact_rekurs(int n)
{
int res;

if(n == 1) return 1;

res = fact_rekurs(n - 1) * n;

//Возвращаем значение переменной "res" в точку вызова функции
return res;
}

Неизвестный
24.09.2008, 21:47
общий
Константин Николаевич зачем? Ведь нормально работает.
Неизвестный
24.09.2008, 22:04
общий
это ответ
Здравствуйте, Visual Scooby!
Рекурсивные функции лучше не использовать там, где без них можно обойтись.


Приложение:
/*//ИТЕРАТИВНЫЙ МЕТОД
//Определяет ввод-вывод
#include <iostream>
//Задает стандартное пространство имен
using namespace std;
//Функция вычисления факториала
double fact(double x)
{
double factorial=1;
for(int i=1;i<=x;i++) factorial*=i;
return factorial;
}

int main()
{
double x,answer;
cout<<"BBEDuTE 4uCJIO: ";
cin>>x;
answer=fact(x);
cout<<answer;
return 0;
}*/

//С ИСПОЛЬЗОВАНИЕМ РЕКУРСИВНОЙ ФУНКЦИИ
//Определяет ввод-вывод
#include <iostream>
//Задает стандартное пространство имен
using namespace std;
//Функция вычисления факториала

double fact(double);
int main()
{
double x,answer;
cout<<"BBEDuTE 4uCJIO: ";
cin>>x;
answer=fact(x);
cout<<answer;

return 0;
}
double fact(double x)
{
if(x<=1)
return 1;
else
return fact(x-1)*x;
}
давно
Старший Модератор
31795
6196
24.09.2008, 22:25
общий
0! сколько будет у Вас?
res = fact_rekurs(n - 1) * n;
res = - 1 * 0;
Правильно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
24.09.2008, 22:34
общий
С стартовым значением 0 - конечно НЕ правильно, но если обеспечивать в коде защиту от всех ситуаций, то сам по себе код как Вы знаете будет большим . Главное что от 1 ... работатет нормально.
давно
Старший Модератор
31795
6196
24.09.2008, 23:07
общий
Николай // МMM:

Цитата: Википедия
Факториа́л числа n (обозначается n!, произносится эн факториа́л) — произведение всех натуральных чисел до n включительно:
По определению полагают 0! = 1. Факториал определён только для целых неотрицательных чисел.

Цитата: Википедия
Существуют два подхода к определению натуральных чисел — числа, используемые при :
перечислении (нумеровании) предметов (первый, второй, третий…) — подход, общепринятый в большинстве стран мира (в том числе и в России).
обозначении количества предметов (нет предметов, один предмет, два предмета…). Принят в трудах Бурбаки, где натуральные числа определяются как мощности конечных множеств.


[offtop] наверное в строковых функциях С, разработчики также думали как и Вы, проверки длины строки нет, поэтому их присутствие в программе может вызывать ошибку переполнения буфера(на пользователя надейся, а сам не плошай). А это уже не правильная работа программы. Могу привести подобные ошибки в Паскале (как бы учебном языке и со строгим синтаксисом). О надстройке Guard не вспоминайте, она слетает "легким движением руки" и превращается в кучу никому не нужного кода(кроме хакера конечно, т.к. написана сама с ошибками), все только потому что разработчики поленились исправить эту ошибку в функциях, но придумали заплатку. [/offtop]

Кстати, нет проверки на отрицательность числа(может красным разрисовать ответ?). Неотрицательное число: это 0 и любое положительное.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
24.09.2008, 23:49
общий
Помогите пожалуйста написать программу для подсчета факториала введённого значения на основе рекурсивной функции


Вот, что просил автор вопроса. Если бы он написал, что нужно программу с проверкой на отрицательность, то без проблем - написал бы.

То, как я написал рекурсию есть в книге Герберта Шилдта , у меня разве что имена переменных другие. А по поводу проверки нарушения границ, то Вы же даже лучше меня знаете, что если бы в С++ были разнобразные проверки нарушения границ и всего прочего например как в Паскаль, то он это был бы не С++. В этом же и есть прелесть языка С++, что за код отвечеает сам кодер - лично мне это нравится. Я вполне с Вами согласен, мне нужно было осуществить в коде реакцию программы на ввод 0 - это действительно нужно было бы сделать.
Неизвестный
25.09.2008, 12:54
общий
это ответ
Здравствуйте, Валуев Александр Михайлович!
#include <iostream.h>

int fact( int k )
{
int f = 1;

for ( int i = 1; i <= k; ++i )
{
f *= i;
}

return f;
}

int main()
{
int z;

cin >> z;

cout << fact( z);

cin.get();

return 0;
}
Форма ответа