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

Тема в разделе "C/C++/C#", создана пользователем CRESTEEN, 6 дек 2011.

  1. CRESTEEN

    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;
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Не ври, код не твой.
     
  3. CRESTEEN

    CRESTEEN Гость

    а чей?
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Понятия не имею, но если бы он был твой, то ты бы знала как избавиться от переменной long now.
    Написав такой код, не составит труда это сделать.

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

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

    CRESTEEN Гость

    мне преподаватель сказал что она тут не нужна...и нужно ее заменить..не поняла чем...

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Замени ее статической переменной внутри функции.
     
  7. CRESTEEN

    CRESTEEN Гость

    аа...поняла...спасибо=)

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Я вот сижу и голову ломаю, как можно представить эту ( sin(a-sin(2a-...sin(na)...)) ) функцию в виде рекурсии... Почему внутри находится только na ?! Это же получается не рекурсивная функция!
     
  9. CRESTEEN

    CRESTEEN Гость

    такое вот задание...нам на лекции дали какие то алгоритмы..похожих заданий..по ним все и делалось..преподаватель когда смотрел работу сказал " похоже на правду"
     
  10. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Хотя... Есть вариант:
    Код (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 );
     
  11. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Нет. Скорее вот так:
    Код (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)...)), надо переломать руки.
     
  12. CRESTEEN

    CRESTEEN Гость

    спасибо, я попробую))

    нельзя так с преподавателем)))))) :blush:
     
  13. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Когда он не примет у тебя очередной зачет, ты будешь говорить по-другому...
     
  14. CRESTEEN

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Это не ошибка а предупреждение.
    Это из-за того, что параметр a у тебя целый, хотя по-сути он должен быть вещественный, кстати так и указано в задании.
    Да, и во всех вычислениях поменяй n * a на a * n !

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

    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;
    }
     
Загрузка...
Похожие Темы - Задача На Рекурсию
  1. elzim
    Ответов:
    0
    Просмотров:
    932
  2. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.128
  3. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.107
  4. MonteCristo
    Ответов:
    1
    Просмотров:
    852
  5. bort
    Ответов:
    1
    Просмотров:
    1.181

Поделиться этой страницей