IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> ПОЛИНОМЫ ЭРМИТА (рекурсия), ПОМОГИТЕ ПЛИЗЗЗ ЗАДАЧУ РЕШИТЬ...
сообщение
Сообщение #1


Гость






Задача такая:
Написать программу для вычисления n-ого полинома эрмита в заданной точке X. Исходные данные - порядок полинома и значение X.
Hn(x) удовлетворяют рекуррентной формуле (где Hn(x) - полином n-ого порядка в точке x):
Hn+1(x) = 2*x*Hn(x)-2*n*Hn-1 (x)
H0(x) = 1,
H1(x) = 2*x.

нужно рекурсивное решение.

в моём поимании рекурсии (видимо ошибочно) функция просто вызывает сама себя (ну там стэк при этом переполняется и всё такое...)... так вот, в моём исполнении при нахождении полинома более чем девятого порядка, эта сволочь пишет об ошибке с плавающей точкой... не знаю чё и делать...
заранее благодарен)))
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






FROL*[night_sniper], так ты решил задачу? Чего же не присоединил файл? Может быть у тебя в мелочи какой недочет? Зачем же еще раз велосипед-то изобретать smile.gif

Покажи, как решаешь. Если нужно - исправим... А вообще, стандартными средствами и факториал 14 тоже переполнение вызывает, приходится использовать спец. алгоритмы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






function pol(n:integer; x:real):real;
begin
if n=0 then pol:=1 else
if n=1 then pol:=2*x else
pol:=2*x*pol(n,x)-2*n*pol(n-1,x);
end;


вроде как-то так... хотя когда в универе делал до 9-ого порядка работало, а типерь ваапсче никак =((
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Во-первых: зациклить рекурсию не боишься?
function pol(n:integer; x:real):real;
begin
if n=0 then pol:=1 else
if n=1 then pol:=2*x else
pol:=2*x*pol(n,x)-2*n*pol(n-1,x); { <--- Здесь 2*x*pol(n, x) !!! }
end;


Ты передашь то же самое N, с которым вошел в рекурсию, зацикливаешься, и получаешь гарантированно переполнение стека.
Ну и второе... Я не знаю, с какими значениями X ты запускаешь программу, но все-таки используй более емкие сопроцессорные типы, например Double...

Я бы делал так:

{$N+} { Для подключения сопроцессора }
function pol(n: integer; x: double): double;
begin
if n=0 then pol:=1
else
if n=1 then pol:=2*x
else
pol:=2*x*pol(n-1, x)-2*n*pol(n-2, x);
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Насчёт подключения сопроцессора - ругается, что неверная директива...
Рекурсия выполняется 7 раз, потом пишет, что неверная операция при операции с плавающей точкой((((
з.ы. X маленькие ставлю - не больше 10.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






М-да...

Только что проверил на Turbo-Pascal. Действительно вылетает. Уже при n = 8... Что характерно - на FPC этой проблемы нет... Значит, ближе к теме: поскольку ошибка №207, то наиболее вероятная ее причина - "Переполнение стека сопроцессора". Избавляться будем, "разгружая" стек сопроцессора, то есть, работать придется с рекурсивной процедурой, а потом "завернем" эту процедуру в функцию. Смотри:
procedure pol(n: integer; x: real; var r: real);
var r1, r2: real;
begin
if n = 0 then r := 1
else
if n = 1 then r := 2 * x
else begin
pol(n - 1, x, r1); r1 := 2*x*r1;
pol(n - 2, x, r2); r2 := 2*n*r2;
r := r1 - r2;
end;

end;

{ "Оборачиваем" процедуру функцией для удобства работы }
function f_pol(n: integer; x: real): real;
var res: real;
begin
pol(n, x, res);
f_pol := res;
end;

begin
writeln(f_pol(19, 2.3):15:7);
end.
При n = 19 все отработало даже при бОльших значениях X smile.gif

Этот вариант тебя устроит?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ага))) Спасибо тебе ОГРОМНОЕ))) give_rose.gif good.gif wub.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 24.10.2017 9:06
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"