Помогите, пожалуйста, составить программу на Паскале: вычисляет произведение отрицательных компонентов одномерного массива, при помощи рекурсии в функции.
Вот мой вариант, но он неработоспособный:
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. В программе не нужно вызывать pot в цикле - зачем? Вызовите её 1 раз для первого элемента.
2. Если очередной элемент равен нулю, то нужно pot приравнивать не к 1, а к рекурсивному вызову функции (как в следующей строке, только без множителя a[i]).
3. Определитесь, как Вы будете идти по массиву: от начала к концу, или от конца к началу. В первом случае изначально нужно вызывать pos для первого элемента, а в ней вызывать p(i+1,a). Если от конца к началу - тогда, соответственно, всё наоборот.
4. В функции pos нужно проверять, что каждый раз индекс не выходит за границы массива.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)