Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2015, 00:53   #1
JohnyJ
 
Регистрация: 29.11.2015
Сообщений: 4
Восклицание Рекурсия в Pascal

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


Программа с использованием:

Код:
program Rekursia (input, output);
var n: integer;
f: real;
function Rekurs(n1:real): real;
var i,n2:integer;
   begin
     n2:=trunc(n1);
      for i:=1 to n2 do
      if (n2 = 1) then
      Rekurs := 3
      else
      Rekurs:= Rekurs((2*i + 1)/ exp(ln(i)*3));
      Rekurs:= f;
   end;
 
 
 
    begin
       writeln ('Enter n');
       readln (n);
       f:= Rekurs (n);
       writeln (f)
    end.

Ошибка "StackOverflowException: Программа завершена из-за переполнения программного стека"

Условие:
Изображения
Тип файла: png Capture.PNG (4.6 Кб, 98 просмотров)

Последний раз редактировалось BDA; 29.11.2015 в 01:44.
JohnyJ вне форума Ответить с цитированием
Старый 29.11.2015, 01:49   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

1) Для оформления кода используйте кнопочку # (Решетка), расположенную над полем ввода текста.
2) Определитесь, за что у вас отвечает параметр функции Rekurs.
3) Зачем вам нужен цикл, если нужно организовать рекурсию?
Например, печать всех чисел от n до 1:
Код:
var
  n: integer;
 
procedure rec(n: integer);
begin
  if n < 1 then
    exit;
  write(n, ' ');
  rec(n - 1);
end;
 
begin
  readln(n);
  rec(n);
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.11.2015, 01:49   #3
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Код:
function Rekurs(n:integer): real;
var
r:real;
begin
if (n = 1) then
r := 3
else
r:= Rekurs(n-1)*(2*n + 1)/(n*sqr(n));
Rekurs:=r;
end;
2BDA
Это наверняка списанная у кого-то программа. Спрашивать бесполезно, если человек хочет действительно разобраться, он сам напишет вопросы.

Последний раз редактировалось temaps; 29.11.2015 в 01:52.
temaps вне форума Ответить с цитированием
Старый 29.11.2015, 02:27   #4
JohnyJ
 
Регистрация: 29.11.2015
Сообщений: 4
По умолчанию

Извините, реально не вставил вопрос в тему.

Программа моя, просто не знаю из-за чего вылетает эта ошибка, поскольку условия окончания рекурсии вроде как задал цыклом (не знаю можно ли так, но в условии задачи нужно найти произведение для всех i от 1 до n, n задаем с клавиатуры)
JohnyJ вне форума Ответить с цитированием
Старый 29.11.2015, 03:50   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

temaps, такое сложно списать
JohnyJ, в принципе, решение привел выше temaps.
Если рассматривать вашу программу. Во-первых, отбросим строчку Rekurs:= f;, которая при вызове Rekurs с любым параметром будет просто возвращать значение глобальной переменной f. Теперь разберемся с циклом. Предположим, что он проработал, тогда переменная Rekurs будет содержать значение только с последней итерации цикла, а значения с других итераций просто будут потеряны. Но и это еще не конец. Для всех значений i будет вызвана функция Rekurs с параметром, равным (2*i + 1)/ exp(ln(i)*3), так как проверка в коде (n2 = 1), а не (i = 1). То есть, при i = 1 будет вызвана Recurs(3), в которой также произойдет вызов Recurs(3), и так далее. Таким образом программа займет весь стек.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Рекурсия Rediska512 Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2012 15:54
pascal.Рекурсия. kelly Помощь студентам 2 16.12.2011 18:37
Рекурсия!!!(PASCAL) Cas01 Помощь студентам 0 16.03.2011 17:45
Pascal Рекурсия! Korun Помощь студентам 3 16.12.2009 16:50
Pascal: Рекурсия MaGWaY_minsk Помощь студентам 2 19.02.2009 09:46