Помощь - Поиск - Пользователи - Календарь
Полная версия: ПОЛИНОМЫ ЭРМИТА (рекурсия)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
FROL*[night_sniper]
Задача такая:
Написать программу для вычисления 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.

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

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

Покажи, как решаешь. Если нужно - исправим... А вообще, стандартными средствами и факториал 14 тоже переполнение вызывает, приходится использовать спец. алгоритмы...
Гость
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-ого порядка работало, а типерь ваапсче никак =((
volvo
Во-первых: зациклить рекурсию не боишься?
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;
FROL*[night_sniper]
Насчёт подключения сопроцессора - ругается, что неверная директива...
Рекурсия выполняется 7 раз, потом пишет, что неверная операция при операции с плавающей точкой((((
з.ы. X маленькие ставлю - не больше 10.
volvo
М-да...

Только что проверил на 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

Этот вариант тебя устроит?
FROL*[night_sniper]
Ага))) Спасибо тебе ОГРОМНОЕ))) give_rose.gif good.gif wub.gif
how long does plaquenil take to
Clomid Prix Forum
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.