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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2018, 17:05   #1
Broooks
Новичок
Джуниор
 
Регистрация: 31.03.2018
Сообщений: 1
Вопрос Рекурсия и переполнение стека памяти С++

Доброго времени суток форумчане у меня проблема при отладке пишет что происходит переполнение стека памяти как этого избежать?
Вот весь код полностью
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <conio.h>
#include <iomanip>
using namespace std;
ofstream fout; //Объявление выходного файлового потока
//---------------------------------Вычисление n -------------------------------
long fact(int n)
{
	if(n<0) return (0);
		else if(n==0) return (1);
			else return (n);
}
//-----------------------------------Вычисление x^n -------------------------------------------
double stx ( double x , int n )
{
if (n == 0) return (1); // здесь рекурсия прерывается;
	if (x == 0) return (0);
		if (n==1) return (x);
			if ( n > 0 ) return (x * stx (x, n-1 ));
				if ( n < 0 ) return (stx ( x , n+1 ) / x);
}
//----------------------------------Вычисление (-1)^n --------------------------------------
int st (int n) 
{
if ((n==0) || (n%2==0)) return 1;
	else return (-1);
}
//---------------------- Функция вычисления очередного члена ряда---------------
float next ( float x, int n)
{ 
	return st(n)*stx(x,2*n+1)/fact(2*n+1);
}
//--------------------------Описание типа – указателя на функции-------------------
typedef float (*func)(float, int);
//----------Вычисление суммы с помощью while и рекуррентной формулы---
float S1 (int n, float x, float e)
{ 
	float a =x, s=0;
		while (fabs(a)>e)
{
	s+=a; 
		a*=(-1* x*x/(2*(n+1)*(2*n+3))); n++; 
}
return (s+a);
}
//-------Вычисление суммы с помощью do-while и рекуррентной формулы--
float S2 ( int n, float x, float e)
{ 
	float a =x , s=0;
		do
{
	s+=a; 
		a*=(-1* x*x/(2*(n+1)*(2*n+3))); n++; 
}
while (fabs(a)>e);
	return (s+a);
}
//----------Вычисление суммы с помощью while и параметра – функции------
float S3 ( int n, float x, float e, func fn)
{
	float f = fn(x,n), s=0;
		while(fabs(f)>e)
{
	s+=f; 
		n++; f=fn(x,n);
}
return (s+f);
}
//--------Вычисление суммы с помощью do-while и параметра – функции----
float S4 ( int n, float x, float e, func fn)
{ 
	float f=fn(x,n) , s=0;
		do
{
	s+=f; 
		n++; f=fn(x,n);
}
			while(fabs(f)>e);
				return (s+f);
}
//-----С помощью рекурсивного суммирования и параметра – функции-------
float S5 ( int n, float x, float e, func fn)
{ 
	float f = fn(x,n);
		if(fabs(f)<e) return f;
			else return (f+ S5(n+1, x, e, fn));
}
//------------------------------------Главная функция-------------------------------------
void main()
{
	float e = 1.e-5; // точность вычислений;
		fout.open("l5.res"); // открытие файла результатов для записи;
			if(!fout) 
{ 
	cout<<"Ошибка открытия файла результатов"; exit(0);
}
//----------------------------Вывод заголовка и шапки таблицы----------------------
fout<<"\t\t\tРезультаты для e = " <<e<<'\n'
<< "|-----|----------|----------|----------|----------|----------|----------|" <<'\n'
<< "| x   |		 sin |		 S1 |		S2 |	    S3    |	 S4 |		 S5 |" <<'\n'
<< "|-----|----------|----------|----------|----------|----------|----------|";
for(float x=1;x>-1;x-=0.5)
{ 
	fout<< endl<<'|'<<setw(4)<<x<<setw(2)<<'|'<<setw(10)<<sin(x)<<'|'
		<<setw(10) << S1(0,x,e)<<'|'<<setw(10) << S2(0,x,e) << '|' << setw(10)
			<< S3(0,x,e,next) << '|'<< setw(10) << S4(0,x,e,next) << '|' << setw(10) 
				<< S5(0,x,e,next) << '|';
}
fout<<'\n'<<"|-----|----------|----------|----------|----------|----------|----------|";
	fout.close();
}
Broooks вне форума Ответить с цитированием
Старый 31.03.2018, 23:29   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение стека Ericnex Помощь студентам 5 08.12.2014 10:12
Переполнение стека DeKot Общие вопросы Delphi 4 02.02.2012 01:28
Переполнение стека NoHeart Общие вопросы Delphi 8 08.11.2009 16:03
Переполнение стека Ake Паскаль, Turbo Pascal, PascalABC.NET 3 30.05.2009 22:39
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16