Рекурсия
От: Empty  
Дата: 19.11.05 13:31
Оценка:
Люди, помогите, надо решить задачу по вычислению:
y(n+1)=(cos(y(n)))^2/(x+y(n))
где х=3.4, при п=0 у0=0.7
выполнять, пока |y-y0|>e, где е=0.00001
ИСПОЛЬЗУЯ РЕКУРЕНТНОЕ ВЫРАЖЕНИЕ!!!
У меня идёт переполнение стека, т.к. ф-ция вызывает себя 2 раза..
Re: Рекурсия
От: Eugene Sh Россия  
Дата: 19.11.05 14:25
Оценка:
Давай уточним: надо использовать рекурентное соотношение или рекурсию в программе?

И ещё одно уточнение. Когда программа должна заканчивать работу: когда |y(n)-y0| < e или |y(n)-y(n-1)| < e? Вычисления, которые я провел, показывают, что первое условие не достигается никогда.

Вот код, который написан для случая:
1) Используется рекурентное соотношение. Рекурсия в программе не используется
2) Программа останавливается при выполнении условия |y(n)-y(n-1)| < e


#include <math.h>
#include <iostream>
using namespace std;

double f(double x, double y_prev)
{
    return cos(y_prev) * cos(y_prev) / (x + y_prev);
}

int main()
{
    double x = 3.4;
    double y0 = 0.7;
    double eps = 1e-5;

    double y_curr = y0;
    double y_prev;
    do
    {
        y_prev = y_curr;
        y_curr = f(x, y_prev);
    } while (fabs(y_curr - y_prev) > eps);

    cout << "y = " << y_curr << endl;

    return 0;
}



Ответ, который выдает программа: y = 2.5599
Рекурсия
От: Empty  
Дата: 19.11.05 16:57
Оценка:
Большое спасибо
Но не могли бы вы сказать мне, можно ли использовать в данном случае именно РЕКУРСИЮ В ПРОГРАММЕ. Т.к. вариант кода подобный вашему я уже использовал
P.S. |y(n)-y(n-1)| < e

Дискуссия подцеплена к исходной теме. — _MM_ & Кодт
Re: Рекурсия
От: R.K. Украина  
Дата: 19.11.05 18:14
Оценка: 6 (1)
Здравствуйте, Empty, Вы писали:

E>Большое спасибо

E>Но не могли бы вы сказать мне, можно ли использовать в данном случае именно РЕКУРСИЮ В ПРОГРАММЕ. Т.к. вариант кода подобный вашему я уже использовал
E>P.S. |y(n)-y(n-1)| < e

Вариант с tail recursion:
#include<iostream>
#include<math.h>

static const double err=0.00001,x=3.4;

double fun(double prev)
{
    const double cur=(cos(prev)*cos(prev))/(x+prev);
    return fabs(cur-prev)<err
        ?cur
        :fun(cur);
}

int main()
{
    std::cout<<fun(0.7)<<std::endl;
    return 0;
}
You aren't expected to absorb this
Re: Рекурсия
От: Кодт Россия  
Дата: 21.11.05 11:07
Оценка:
Здравствуйте, Empty

Пожалуйста, не создавайте новых дискуссий для продолжения диалога. Пишите ответы в исходную ветку.
Перекуём баги на фичи!
Re: Рекурсия
От: Шахтер Интернет  
Дата: 21.11.05 12:46
Оценка: 1 (1) +1 :)
Здравствуйте, Empty, Вы писали:

E>Люди, помогите, надо решить задачу по вычислению:

E>y(n+1)=(cos(y(n)))^2/(x+y(n))
E>где х=3.4, при п=0 у0=0.7
E>выполнять, пока |y-y0|>e, где е=0.00001
E>ИСПОЛЬЗУЯ РЕКУРЕНТНОЕ ВЫРАЖЕНИЕ!!!
E> У меня идёт переполнение стека, т.к. ф-ция вызывает себя 2 раза..

По моему, это в юмор.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.