IPB

Здравствуйте, гость ( Вход | Регистрация )

> Рекурсия и элементы массива
AntiSanta
сообщение 1.11.2012, 19:46
Сообщение #1


Новичок
*

Группа: Продвинутые
Сообщений: 7
Регистрация: 1.11.2012
Город: Питер
Учебное заведение: OmskSpecial #666



Помогите, пожалуйста, составить программу на Паскале: вычисляет произведение отрицательных компонентов одномерного массива, при помощи рекурсии в функции.
Вот мой вариант, но он неработоспособный:

program p1;
uses crt;
type Mas=array [1..20] of integer;

var
i,n,p:integer;
a:Mas;

procedure vvod;
begin
for i:=1 to n do begin
write('a[',i,']=');
readln(a[i]);
end;
end;

function pot(i:integer;a:Mas):integer;
begin
if a[i]=0 then pot:=1 else
if a[i]<0 then pot:=a[i]*pot(i-1,a);
end;

Begin
clrscr;
readln(n);
vvod;
for i:=1 to n do
p:=pot(i,a);
writeln(p);
readkey;
End.


При выполнении моего алгоритма результат - не соответствует действительности, т.е. алгоритм где-то не доработан.
Заранее благодарю Вас!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов(1 - 2)
граф Монте-Кристо
сообщение 1.11.2012, 23:32
Сообщение #2


Доцент
******

Группа: Преподаватели
Сообщений: 3 840
Регистрация: 27.9.2007
Из: Старый Оскол
Город: Москва
Учебное заведение: МФТИ/МАИ
Вы: другое



1. В программе не нужно вызывать pot в цикле - зачем? Вызовите её 1 раз для первого элемента.
2. Если очередной элемент равен нулю, то нужно pot приравнивать не к 1, а к рекурсивному вызову функции (как в следующей строке, только без множителя a[i]).
3. Определитесь, как Вы будете идти по массиву: от начала к концу, или от конца к началу. В первом случае изначально нужно вызывать pos для первого элемента, а в ней вызывать p(i+1,a). Если от конца к началу - тогда, соответственно, всё наоборот.
4. В функции pos нужно проверять, что каждый раз индекс не выходит за границы массива.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
AntiSanta
сообщение 2.11.2012, 6:40
Сообщение #3


Новичок
*

Группа: Продвинутые
Сообщений: 7
Регистрация: 1.11.2012
Город: Питер
Учебное заведение: OmskSpecial #666



Цитата(граф Монте-Кристо @ 1.11.2012, 23:32) *

1. В программе не нужно вызывать pot в цикле - зачем? Вызовите её 1 раз для первого элемента.
2. Если очередной элемент равен нулю, то нужно pot приравнивать не к 1, а к рекурсивному вызову функции (как в следующей строке, только без множителя a).
3. Определитесь, как Вы будете идти по массиву: от начала к концу, или от конца к началу. В первом случае изначально нужно вызывать pos для первого элемента, а в ней вызывать p(i+1,a). Если от конца к началу - тогда, соответственно, всё наоборот.
4. В функции pos нужно проверять, что каждый раз индекс не выходит за границы массива.

Вот полученная программа:
[i]...
function pot(i:integer;a:Mas):integer;
begin
if a[i]=0 then pot:=pot(i-1,a) else
if a[i]<0 then pot:=a[i]*pot(i+1,a);
end;
...
{pot в программе уже вызывается без цикла}

Проверка:
4
a[1]=2
a[2]=3
a[3]=-4
a[4]=-5
Error 202: Stack overflow error.

4
a[1]=-1
a[2]=-2
a[3]=-3
a[4]=4
3812

Я не понимаю в чём проблема. Натолкните, пожалуйста, на правильную дорогу.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 



- Текстовая версия Сейчас: 25.5.2025, 18:12

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru