• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

CRESTEEN

помогите пожалуйста.


Язык 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;
}
 
L

lazybiz

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

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

Где у тебя параметр x, и почему он не вещественный:
Чаще всего параметр n – целый, а параметр x – вещественный. Результат должен быть вещественным типа double.

Добавлено:
В чем смысл умножения на единицу в этом и других случаях: recursion(n-1,a)*1.0 ?
 
C

CRESTEEN

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

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

я этого не заметила...
 
C

CRESTEEN

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

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

lazybiz

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

CRESTEEN

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

lazybiz

Хотя... Есть вариант:
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 );
 
L

lazybiz

Нет. Скорее вот так:
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

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

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", возможна потеря данных
 
L

lazybiz

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

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

CRESTEEN

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

#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;
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!