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.

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

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


Гость






М-да...

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

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

Сообщений в этой теме


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

 



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