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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2007, 09:14   #1
Sergik1977
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 12
По умолчанию Паскаль. Рекурсия

Задача у меня не зачтена, здесь требуется использовать рекурсивную функцию, которая в своем теле вызывает сама себя. Надо рекурсией заменить цикл. А то сын родился времени нет читать что такое рекурсия итд.

Цитата:
[{Контрольная работа №3
Вариант №9 Задача №3
Дан массив a: array[1..n] of integer; Напишите рекурсивную программу для вычисления суммы
сумма i=1 до n. 1/a[i]}

Код:
const n=50;
var F2, F1, z, s: real;
k,w,i: integer;
a: array[1..n] of integer;
begin
{формируем маcсив}
Writeln('Vvedite razmer massiva):');
Readln(w);
Writeln('Vvedite massiv');
for i:= 1 to w do
begin
Write('Massiv[', i, '] : ');
Readln(a[i]);
end;
z:=0;
for i:= 1 to w do  begin
F1:=1/(a[i]+z);
z:=z+a[i];
F2:=F2+F1;
Writeln('massiv',F2);
end;
readln;
end.

Последний раз редактировалось Alex21; 11.11.2007 в 10:48. Причина: оформляем код с использованием тегов code
Sergik1977 вне форума Ответить с цитированием
Старый 11.11.2007, 10:58   #2
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию Рекурсия

Во первых, лучше обьявлять раздел const до раздела var.
1. Рекурсивным вызовом называется ситуация, когда подпрограмма (процедура или функция) вызывает сама себя.
2.При вызове любой (в том числе и рекурсивной) процедуры или функции происходит следующее:
1.Сохраняется адрес возврата, то есть команда, с которой продолжится выполнение программы после того, как процедура или функция закончит работать.
2.Вместе с адресом сохраняются значения всех параметров и локальных переменных.
После окончания работы подпрограммы выполнение продолжается со строки, следующей за ее вызовом.
Теперь еще одна тонкость. Просто так передавать массив в качестве параметра функции нельзя, т.к. программа считает, что это разные типы. Поэтому необходимо обьявить в разделе type уникальный тип, который можно будет передавать нашей функции. Вот код:
Код:
program sd;
uses crt;
const n=50;
type df=array[1..n] of integer;
var
k,w,i: integer;
a: df;
function summ (var f:df;w:integer;k:integer):real;
var s:real;
begin
if (k+1)<=w then begin k:=k+1;
result:=1/f[k]+summ(f,w,k);
end;
end;
begin
Writeln('Vvedite razmer massiva):');
Readln(w);
Writeln('Vvedite massiv');
for i:= 1 to w do
begin
Write('Massiv[', i, '] : ');
Readln(a[i]);
end;
Writeln('massiv ',summ(a,w,0));
readln;
end.

Последний раз редактировалось bill; 11.11.2007 в 11:02.
bill вне форума Ответить с цитированием
Старый 11.11.2007, 11:37   #3
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Этот пример с контролем от переполнения стека
Код:
uses crt;
const
  n = 50;
var
  a: array[1..n] of integer;
  i: integer;

function summa(n: integer): real;
  var
    S: real;
  begin
    if n = 0 then
      summa:=0
    else
      begin
        S:=summa(n-1);
        summa:=S+1/a[n];
      end;
  end;

begin
  randomize;
  for i:=1 to n do a[i]:=1+random(100);
  clrscr;
  writeln('n = ',n);
  write('Massiv [1..n]:');
  for i:=1 to n do write(a[i]:4);
  writeln;
  writeln('Summa 1/a[i] =',summa(n));
  readln;
end.
И, насколько я помню, в паскале нет result
_Dmitry вне форума Ответить с цитированием
Старый 11.11.2007, 17:03   #4
Sergik1977
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 12
По умолчанию

Господа ваши программы работают неправильно Bill что это за команда Result? Мой Паскаль ее не воспринимает!
Sergik1977 вне форума Ответить с цитированием
Старый 11.11.2007, 17:13   #5
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Что значит неправильно? Считает то, что записано в условии
Изображения
Тип файла: bmp ris.bmp (1.7 Кб, 138 просмотров)
_Dmitry вне форума Ответить с цитированием
Старый 11.11.2007, 18:20   #6
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Судя по вашему алгоритму считать нужно это
Код:
uses crt;
const
  n = 50;
var
  i: integer;
  a: array[1..n] of integer;

function summa(n: integer): real;
  var
    S,C: real;
  begin
    if n = 0 then
      begin
        summa:=0;
      end
    else
      begin
        S:=summa(n-1);
        C:=0;
        for i:=1 to n do
          C:=C+a[i];
        summa:=S+1/C;
      end;
  end;

begin
  randomize;
  for i:=1 to n do a[i]:=1+random(100); 
  clrscr;
  writeln('n = ',n);
  write('Massiv [1..n]:');
  for i:=1 to n do write(a[i]:4);
  writeln;
  writeln('Summa 1/a[i] =',summa(n));
  readln;
end.
Изображения
Тип файла: bmp ris1.bmp (3.1 Кб, 134 просмотров)
_Dmitry вне форума Ответить с цитированием
Старый 12.11.2007, 06:11   #7
Sergik1977
Пользователь
 
Регистрация: 18.10.2007
Сообщений: 12
По умолчанию

Дмитрий ты сделал не через рекурсию, цикла не должно быть!
У тебя сделано тоже самое что у меня но через функцию.
Sergik1977 вне форума Ответить с цитированием
Старый 12.11.2007, 08:38   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Дмитрий ты сделал не через рекурсию, цикла не должно
быть!
Неверно, он сделал рекурсией, но судя по твоей задаче тебе нуна что-то вроде этого:

Код:
var a:array[1..10] of integer;v,i:integer;
function s(r:integer):integer;
begin
 inc(i);
 if i<=10 then begin
  v:=v+r;
  s:=s(a[i]);
 end;
end;

begin
{Здесь мы набиваем массив, надеюсь сам это сделаешь}
writeln;
v:=1;      
 i:=1;
 s(a[i]);
 write(v);
end.
(...Это на вскидку код, посему помидорами не бросать, и возможные баги подтереть...)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.11.2007, 17:08   #9
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Я свой код в компиляторе проверял- работает. Вам надо заменить result на название функции- summ. Все будет работать!
bill вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия. p@ul Помощь студентам 4 30.12.2009 14:46
Паскаль. Рекурсия. Лёха Помощь студентам 2 20.03.2008 22:54
рекурсия Vital_k Паскаль, Turbo Pascal, PascalABC.NET 1 08.02.2008 13:09
Рекурсия АнНютик Паскаль, Turbo Pascal, PascalABC.NET 1 29.01.2008 22:50
Рекурсия Pravednik Помощь студентам 3 21.01.2008 14:18