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

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

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

> ПОЛИНОМЫ ЭРМИТА (рекурсия), ПОМОГИТЕ ПЛИЗЗЗ ЗАДАЧУ РЕШИТЬ...
FROL*[night_sniper]
сообщение 3.04.2006 21:56
Сообщение #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.

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

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


Гость






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

Покажи, как решаешь. Если нужно - исправим... А вообще, стандартными средствами и факториал 14 тоже переполнение вызывает, приходится использовать спец. алгоритмы...
 К началу страницы 
+ Ответить 
Гость
сообщение 3.04.2006 22:33
Сообщение #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-ого порядка работало, а типерь ваапсче никак =((
 К началу страницы 
+ Ответить 
volvo
сообщение 3.04.2006 22:41
Сообщение #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;
 К началу страницы 
+ Ответить 
FROL*[night_sniper]
сообщение 3.04.2006 22:50
Сообщение #5


Гость






Насчёт подключения сопроцессора - ругается, что неверная директива...
Рекурсия выполняется 7 раз, потом пишет, что неверная операция при операции с плавающей точкой((((
з.ы. X маленькие ставлю - не больше 10.
 К началу страницы 
+ Ответить 
volvo
сообщение 3.04.2006 23:22
Сообщение #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

Этот вариант тебя устроит?
 К началу страницы 
+ Ответить 
FROL*[night_sniper]
сообщение 5.04.2006 10:03
Сообщение #7


Гость






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

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

 



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