Помогите С Задачей На Рекурсию С++

  • Автор темы doompochta
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

doompochta

#1
Найти значение выражения, используя рекурсию:
T[sub]0[/sub](x)=1, T[sub]1[/sub](x)=x, T[sub]k+1[/sub](x)=2*x*T[sub]k[/sub](x)-T[sub]k-1[/sub](x) для k>=2

Программа выдает ошибку сегментации для k>=2, первый раз имею дело с рекурсией, может не так понимаю условие задачи? помогите разобраться:

Код:
#include<iostream.h>

float tn(float, int);

int main()
{

int b;
float c,d;

cout<<"vvedite x"<<endl;
cin>>c;
cout<<"vvedite k"<<endl;
cin>>b;

d=tn(c,b);
cout<<d<<endl;

system("pause");
return 0;
}

float tn(float x, int k)
{
float a;

if (k==0) a=1;
else if (k==1) a=x;
else if (k>=2) a=2*x*tn(x,k)-tn(x,k-1);

return a;
}
 
R

rrrFer

#2
float tn(float x, int k)
{
...
*x*tn(x,k)-
}
оно стопудово зациклится,
из функции f(1,2) вы вызываете опять f(1,2) и так до бесконечности.

Надо обратить внимание на то, что в левой части вашего выражения стоит T(k+1) = ... , но вы написали как будто T(k)

Я думаю, надо взять вот то выражение и выразить из него T(k), препод над Вами издевается :)

а так, все почти правильно :)

только код ваш я бы чуть переписал, некрасивые else режут глаза.


Код:
float f(float x, int k) {	
if (k==0) return 1;
if (k==1) return x;
return ... //что-то там
}
 
D

doompochta

#3
оно стопудово зациклится,
из функции f(1,2) вы вызываете опять f(1,2) и так до бесконечности.

Надо обратить внимание на то, что в левой части вашего выражения стоит T(k+1) = ... , но вы написали как будто T(k)

Я думаю, надо взять вот то выражение и выразить из него T(k), препод над Вами издевается :)

а так, все почти правильно :)

только код ваш я бы чуть переписал, некрасивые else режут глаза.


Код:
float f(float x, int k) {	
if (k==0) return 1;
if (k==1) return x;
return ... //что-то там
}
Выразил tn(x,k):
Код:
float tn(float x, int k)
{

if (k==0) return 1;
if (k==1) return x;
return (tn(x,k+1)+tn(x,k-1))/(2*x);
}
Однако, ошибка осталась(
 
R

rrrFer

#4
f (1, 3) вызовет f (1, 2) и f (1, 4)
f (1, 2) вызовет f (1, 1) и f (1, 3)
=> цикл
 
R

rrrFer

#5
считать все-таки надо T(k+1) :)

можно вывести более нормальную формулу. Посчитайте на бумаге как должна работатьпрограмма, легко найдете закономерность. Но можно и так написать:
Код:
#include<iostream>

float tn(float, int);
float f(float, int);

int main() {
std::cout << f(3.f, 4) << std::endl;
}

float f(float x, int k) {
return tn(x, k - 1);
}

float tn(float x, int k) { 
if (0 == k)
return 1;
if (1 == k)
return x;
return 2 * x * tn(x, k - 1) - tn(x, k - 2);
}
 
Статус
Закрыто для дальнейших ответов.