Задача На Рекурсию

  • Автор темы CRESTEEN
  • Дата начала
C

CRESTEEN

Гость
#1
помогите пожалуйста.


Язык C++

Вычислить искомое выражение двумя способами. В обоих случаях расчет выражения должен осуществляться с использованием написанных функций – рекурсивной и нерекурсивной. Предполагается, что значения параметров удовлетворяют заданным ограничениям. Чаще всего параметр n – целый, а параметр x – вещественный. Результат должен быть вещественным типа double.
sin(a-sin(2a-...sin(na)...)),n>0, a любое число.

вот мой код. нужно исправить ошибку в рекурсии. и избавиться от переменной long now. не могу понять как сделать. запуталась. помогите если не трудно. заранее спасибо.

C++:
#include "stdafx.h"
#include "conio.h"
#include "math.h"
#include <iostream>

long now;//вспомогательная переменная

double recursion(long n, long a)//находит значение используя рекурсию
{
now--;
if (n==1) 
return sin((n-now)*a*1.0);//если 1 то выводим значение
return sin(a*(n-now)-recursion(n-1,a)*1.0);//если нет то функция вызывает сама себя
}

double norecursion(long n, long a)//находит значение не используя рекурсию
{
double result=sin(a*n*1.0),pre;
for (int i=1;i<n;i++)
{
pre=result;//пошагово находит результат каждого действия
result=sin((n-i*1.0)*a-pre);
}
return result;
}


int _tmain(int argc, _TCHAR* argv[])
{
long n=1;
long a=1;
double res;
printf("Computing the expression sin(a-sin(2a-...sin(n*a)...))\n");
printf("Input variable a\n");
std::cin>>a;
printf("Input variable n\n");
std::cin>>n;
now=n;
res=recursion(n,a);
std::cout<<res<<"\n";
res=norecursion(n,a);
std::cout<<res;
getch();
return 0;
}
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#4
Понятия не имею, но если бы он был твой, то ты бы знала как избавиться от переменной long now.
Написав такой код, не составит труда это сделать.

Да, а почему у тебя функция: sin(a-sin(2a-...sin(na)...)), но в коде из a синус не вычитается?

Где у тебя параметр x, и почему он не вещественный:
Чаще всего параметр n – целый, а параметр x – вещественный. Результат должен быть вещественным типа double.
Добавлено:
В чем смысл умножения на единицу в этом и других случаях: recursion(n-1,a)*1.0 ?
 
C

CRESTEEN

Гость
#5
Понятия не имею, но если бы он был твой, то ты бы знала как избавиться от переменной long now.
Написав такой код, не составит труда это сделать.
мне преподаватель сказал что она тут не нужна...и нужно ее заменить..не поняла чем...

Да, а почему у тебя функция: sin(a-sin(2a-...sin(na)...)), но в коде из a синус не вычитается
я этого не заметила...
 
C

CRESTEEN

Гость
#7
Замени ее статической переменной внутри функции.
аа...поняла...спасибо=)

а вы не могли бы сказать. в чем состоит ошибка в рекурсии..без рекурсии считается все правильно...я просто не могу найти
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#8
Я вот сижу и голову ломаю, как можно представить эту ( sin(a-sin(2a-...sin(na)...)) ) функцию в виде рекурсии... Почему внутри находится только na ?! Это же получается не рекурсивная функция!
 
C

CRESTEEN

Гость
#9
Я вот сижу и голову ломаю, как можно представить эту ( sin(a-sin(2a-...sin(na)...)) ) функцию в виде рекурсии... Почему внутри находится только na ?! Это же получается не рекурсивная функция!
такое вот задание...нам на лекции дали какие то алгоритмы..похожих заданий..по ним все и делалось..преподаватель когда смотрел работу сказал " похоже на правду"
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#10
Хотя... Есть вариант:
C++:
double recursion( int n, int n_max, int a )
{
if ( n < n_max ) return n * a - sin( recursion( n + 1, n_max, a ) );
return n * a;
}
Вызывать так: recursion( 0, n, a );
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#11
Нет. Скорее вот так:
C++:
double recursion( int n, int n_max, int a )
{
if ( n < n_max ) return n * a - sin( recursion( n + 1, n_max, a ) );
return n * a - sin( n * a );
}
А вообще, тому кто написал вот это: sin(a-sin(2a-...sin(na)...)), надо переломать руки.
 
C

CRESTEEN

Гость
#14
Когда он не примет у тебя очередной зачет, ты будешь говорить по-другому...
у меня экзамен у него) чтобы я не сдавала он везде находит ошибки..а объяснить как исправить почему то не объясняет)

C++:
double recursion( int n, int n_max, int a )
{
if ( n < n_max ) return n * a - sin( recursion( n + 1, n_max, a ) );
return n * a - sin( n * a );
}
тут ошибку выдает warning C4244: аргумент: преобразование "float" в "long", возможна потеря данных
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#15
тут ошибку выдает warning C4244: аргумент: преобразование "float" в "long", возможна потеря данных
Это не ошибка а предупреждение.
Это из-за того, что параметр a у тебя целый, хотя по-сути он должен быть вещественный, кстати так и указано в задании.
Да, и во всех вычислениях поменяй n * a на a * n !

преобразование "float" в "long"
А откуда там float ? Я тебе примеров с float не делал. Только с double.
 
C

CRESTEEN

Гость
#16
код с исправлениями вот так же должен выглядеть?

#include "stdafx.h"
#include "conio.h"
#include "math.h"
#include <iostream>



C++:
double recursion( int n, int n_max, int a )
{
if ( n < n_max ) return a*n! - sin( recursion( n + 1, n_max, a ) );
return n * a - sin( a*n! );
}

double norecursion(long n, long a)//находит значение не используя рекурсию
{
double result=sin(a*n*1.0),pre;
for (int i=1;i<n;i++)
{
pre=result;//пошагово находит результат каждого действия
result=sin((n-i*1.0)*a-pre);
}
return result;
}


int _tmain(int argc, _TCHAR* argv[])
{
long n=1;
long a=1;
double res;
printf("Computing the expression sin(a-sin(2a-...sin(a*n!)...))\n");
printf("Input variable a\n");
std::cin>>a;
printf("Input variable n\n");
std::cin>>n;
now=n;
res=recursion(n,a);
std::cout<<res<<"\n";
res=norecursion(n,a);
std::cout<<res;
getch();
return 0;
}