![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
FROL*[night_sniper] |
![]() ![]()
Сообщение
#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 |
![]()
Сообщение
#2
|
Гость ![]() |
FROL*[night_sniper], так ты решил задачу? Чего же не присоединил файл? Может быть у тебя в мелочи какой недочет? Зачем же еще раз велосипед-то изобретать
![]() Покажи, как решаешь. Если нужно - исправим... А вообще, стандартными средствами и факториал 14 тоже переполнение вызывает, приходится использовать спец. алгоритмы... |
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
function pol(n:integer; x:real):real; вроде как-то так... хотя когда в универе делал до 9-ого порядка работало, а типерь ваапсче никак =(( |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Во-первых: зациклить рекурсию не боишься?
function pol(n:integer; x:real):real; Ты передашь то же самое N, с которым вошел в рекурсию, зацикливаешься, и получаешь гарантированно переполнение стека. Ну и второе... Я не знаю, с какими значениями X ты запускаешь программу, но все-таки используй более емкие сопроцессорные типы, например Double... Я бы делал так: {$N+} { Для подключения сопроцессора } |
FROL*[night_sniper] |
![]()
Сообщение
#5
|
Гость ![]() |
Насчёт подключения сопроцессора - ругается, что неверная директива...
Рекурсия выполняется 7 раз, потом пишет, что неверная операция при операции с плавающей точкой(((( з.ы. X маленькие ставлю - не больше 10. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
М-да...
Только что проверил на Turbo-Pascal. Действительно вылетает. Уже при n = 8... Что характерно - на FPC этой проблемы нет... Значит, ближе к теме: поскольку ошибка №207, то наиболее вероятная ее причина - "Переполнение стека сопроцессора". Избавляться будем, "разгружая" стек сопроцессора, то есть, работать придется с рекурсивной процедурой, а потом "завернем" эту процедуру в функцию. Смотри: procedure pol(n: integer; x: real; var r: real);При n = 19 все отработало даже при бОльших значениях X ![]() Этот вариант тебя устроит? |
FROL*[night_sniper] |
![]()
Сообщение
#7
|
Гость ![]() |
Ага))) Спасибо тебе ОГРОМНОЕ)))
![]() ![]() ![]() |
![]() ![]() |
![]() |
Текстовая версия | 11.08.2025 2:00 |