Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2012, 12:15   #1
Dmitry_Web
Пользователь
 
Аватар для Dmitry_Web
 
Регистрация: 01.11.2011
Сообщений: 43
По умолчанию Оптимизация рекурсии

Код:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int factorial( int );
int factorial_1( int );
int factorial_2( int );

void main()
{
	int n;

	cout << "Vvedite chislo: ";
	cin >> n;

	cout << "Factorial " << n << " raven: " << factorial( n ) << "   " <<
		factorial_1( n ) << "   " <<
		factorial_2( n ) << endl;

}


int factorial( int n )
{
	if( n == 0 )
		return 1;
	else return n * factorial( n - 1 );
}

// В 2 раза меньше вызовов
int factorial_1( int n )
{
	if( n <= 1 )
		return 1;
	else return n * ( n - 1 ) * factorial( n - 2 );
}

// В 3 раза меньше вызовов
int factorial_2( int n )
{
	if( n <= 1 )
		return 1;
	else 
	{
		if( n == 2 )
			return 2;
		else return n * ( n - 1 ) * ( n - 2 ) * factorial( n - 3 );
	}
}
Я думаю из кода всё понятно, но дело вот в чём:
- максимальный факториал у всех функций 33 считается неправильно, да и другие( не все конечно, но всё же ) неправильно.
-factorial_1 и factorial_2 должны считать " дальше ", не так ли?
Dmitry_Web вне форума Ответить с цитированием
Старый 09.07.2012, 12:35   #2
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Типы данных С++
astecenko вне форума Ответить с цитированием
Старый 09.07.2012, 12:57   #3
Dmitry_Web
Пользователь
 
Аватар для Dmitry_Web
 
Регистрация: 01.11.2011
Сообщений: 43
По умолчанию

Цитата:
Сообщение от astecenko Посмотреть сообщение
Факториал всегда же int.
Dmitry_Web вне форума Ответить с цитированием
Старый 09.07.2012, 13:32   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Ага, особенно 33! = 86833176188118864955181944012800000 00.
Somebody вне форума Ответить с цитированием
Старый 09.07.2012, 13:57   #5
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

Ну почему же int, используйте double и вы сможете считать факториалы чисел вплоть до 170! . Конечно тогда придется учесть т.н. защиту от дурака. А еще почитайте на википедии статью о факториалах, там вроде помню выводили формулу, в которую просто подставляешь число и получаешь факториал. Я ее даже проверял в программе. Но ошибку она дает куда большую, чем первая фунция в этом коде, зато и числа по-моему больше 170! считает.

Кстати на правильность наверное не стоит грешить, машина не может считать факториалы (ровно как и все остальное) с точностью до верного. С очень большими и очень маленькими числами всегда возникают проблемы, это связано с представлением числа в машине. Попробуйте, к примеру, в типе float от числа 123456789 отнять число 123456788 - машина ответит: 8. В double такой проблемы не возникнет, но возникнет с числом еще большим этого.
Повторенье - мать ученья. И прибежище для лентяев.

Последний раз редактировалось Stilet; 09.07.2012 в 14:28.
Artem_Kokos вне форума Ответить с цитированием
Старый 10.07.2012, 07:43   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Код:
unsigned long long int x = 0xFFFFFFFFFFFFFFFF;
cout << x << " ";
Но и этого будет мало!
Тут нужно использовать длинную арифметику, если хотите получить точные результаты
Если нужны приблизительные значения, то long double или double подойдут
Код:
#include <iostream>
#include <limits>
int main()
{
    std::cout << std::numeric_limits<long double>::max() << std::endl;
    return 0;
}
Но в Visual Studio, long double синоним double, во многих других компиляторах long double 10 байт
Kostia вне форума Ответить с цитированием
Старый 10.07.2012, 18:05   #7
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

long double? ого...
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсии fre Паскаль, Turbo Pascal, PascalABC.NET 2 03.04.2012 09:59
Пмощь в рекурсии. KOPC1886 Помощь студентам 0 27.11.2010 13:36
Рекурсии RAMA Паскаль, Turbo Pascal, PascalABC.NET 6 18.10.2009 13:56
Рекурсии в pascal Nogard Помощь студентам 1 22.06.2009 12:08
Рекурсии Logan Паскаль, Turbo Pascal, PascalABC.NET 1 13.05.2008 08:52