![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
AntiSanta |
![]() ![]()
Сообщение
#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. При выполнении моего алгоритма результат - не соответствует действительности, т.е. алгоритм где-то не доработан. Заранее благодарю Вас! |
граф Монте-Кристо |
![]()
Сообщение
#2
|
Доцент ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 3 840 Регистрация: 27.9.2007 Из: Старый Оскол Город: Москва Учебное заведение: МФТИ/МАИ Вы: другое ![]() |
1. В программе не нужно вызывать pot в цикле - зачем? Вызовите её 1 раз для первого элемента.
2. Если очередной элемент равен нулю, то нужно pot приравнивать не к 1, а к рекурсивному вызову функции (как в следующей строке, только без множителя a[i]). 3. Определитесь, как Вы будете идти по массиву: от начала к концу, или от конца к началу. В первом случае изначально нужно вызывать pos для первого элемента, а в ней вызывать p(i+1,a). Если от конца к началу - тогда, соответственно, всё наоборот. 4. В функции pos нужно проверять, что каждый раз индекс не выходит за границы массива. |
AntiSanta |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Продвинутые Сообщений: 7 Регистрация: 1.11.2012 Город: Питер Учебное заведение: OmskSpecial #666 ![]() |
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 Я не понимаю в чём проблема. Натолкните, пожалуйста, на правильную дорогу. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 18:53 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru