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

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

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

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