0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 7
1

Ошибка 207 в рекурсивной функции

25.04.2014, 06:57. Показов 1140. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Волею судеб пришлось вспоминать Паскаль в свои преклонные годы. Вот такая примитивная задача: Найти сумму членов ряда 1\(i*i), где i от 1 до n.

Все это дело вылилось в такой код:


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program test;
uses crt;
var
   n: byte;
   sum: real;
 
[I]function summ(n: byte): real;
begin
    if n=1 then summ:=1 else
        summ:=(1/(n*n))+summ(n-1);
end;[/I]
 
begin
     clrscr;
     sum:= 0;
     readln(n);
     
     sum:=summ(n);
     writeln(sum);
     readln;
end.
Собственно, саму функцию выделил курсивом. Самое интересное, что она все считает правильно, но только до n=8, начиная с 9 выдает ошибку 207 операции с плавающей точкой. Не понимаю почему так? Подскажите, плс, в чем дело? Заранее преогромно благодарен!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2014, 06:57
Ответы с готовыми решениями:

Ошибка 207 при вычислении функции
Помогите с вычислением: PROGRAM PR1; VAR A,X,Y,Z,B: REAL; BEGIN X:=0.875; A:=1.566;...

Ошибка 207 при вычислении функции
Итак ошибка 207. Я просмотрел на форуме целый ряд тем. Лишний раз убедился, что эта ошибка...

Вычислить значение функции для аргумента х, который меняется от Х1 до х2 с шагом Н (ошибка 207)
Почему-то выдает 207 ошибку, хотя не должен. Кто может подсказать? Условие поставленной задачи:...

Для заданного количества элементов ряда n, вычислить значение функции (ошибка 207)
Не могу найти ошибку!( Для заданого количества элементов ряда n, вычислить значение функции: ...

4
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
25.04.2014, 10:04 2
Лучший ответ Сообщение было отмечено MadVombat как решение

Решение

В данном случае ошибка 207 вызвана переполнением стека сопроцессора.
Это преодолевают так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
program test;
uses crt;
var n: byte;
    sum: real;
 
function summ(n: byte): real;
var t:real;{переменная для хранения предыдущего результата}
begin
if n=1 then summ:=1 else
 begin
  t:=summ(n-1);{запоминаем, очишаем стек}
  summ:=(1/(n*n))+t;
 end;
end;
 
begin
clrscr;
readln(n);
sum:=summ(n);
writeln(sum:0:8);
readln;
end.
0
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 7
25.04.2014, 10:18  [ТС] 3
Спасибо! Я правильно понимаю - функция ведь осталась рекурсивной? А мой первоначальный вариант является ошибочным? Делал согласно теории по учебникам. Я могу, например, написать его в качестве ответа, но дополнить Вашим вариантом как более жизнеспособным?
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
25.04.2014, 10:21 4
Функция осталась рекурсивной, а Ваш вариант в принципе верный, не во всех функциях происходит переполнение стека.
0
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 7
25.04.2014, 10:23  [ТС] 5
Еще раз спасибо! Очень помогли и прояснили ситуацию.
0
25.04.2014, 10:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2014, 10:23
Помогаю со студенческими работами здесь

Разработать программу согласно алгоритму с использованием рекурсивной функции и без использования рекурсивной
Разработать программу согласно алгоритму с использованием рекурсивной функции и без использования...

Разработать программу по алгоритму с использование рекурсивной функции и без использования рекурсивной функции
Разработать программу по алгоритму с использование рекурсивной функции и без использования...

Ошибка в рекурсивной функции
Всем добрый день/вечер. Никак не могу понять, почему результат рекурсивной функции int exp не...

Написать функции рекурсивной и не рекурсивной реализации алгоритма Евклида нахождения наибольшего общего делителя (НОД) двух натуральных чисел
Написать функции рекурсивной и не рекурсивной реализации алгоритма Евклида нахождения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru