IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Рекурсия в процедуре (работа с массивом), Найти, используя рекурсивную процедуру, кол-во несовершенных элементов
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


Найти, используя рекурсивную процедуру, кол-во несовершенных элементов массива (возможно использование доп. подпрограммы)

Собсно код. При любых входных данных выдает ноль((
Ошибку помогите найти)

type mas=array [1..100] of integer;
var a:mas; i,n,t:integer;

function sov(x:integer):boolean;
var s,i:integer;
begin
s:=0;
for i:=1 to (x div 2) do
if (x mod i)=0 then s:=s+i;
if s=x then sov:=true
else sov:=false;
end;

procedure kol(n:integer;a:mas; var k:integer);
begin
if n=0 then k:=0
else begin
if sov(a[n])=false then k:=k+1;
kol(n-1,a,k);
end;
end;
begin
readln(n);
for i:=1 to n do
readln(a[i]);

kol(n,a,t);
writeln(t);
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Ошибку помогите найти)
Ошибку? Пожалуйста:

1) Передавать массив из 100 целых через стек - очень опрометчиво. Передавай как константную ссылку (все равно в подпрограммах массив не меняется)

2) Ну, считаешь ты считаешь, а когда заканчивается выполнение рекурсивной процедуры? Когда n = 0. Следовательно, тогда, перед выходом, K присваивается 0. А вот если поменять местами 18-ю и 19-ю строки:

procedure kol(n:integer;a:mas; var k:integer);
begin
if n=0 then k:=0
else begin
kol(n-1,a,k); // сначала считаем, сколько в предыдущих элементах
if sov(a[n])=false then k:=k+1; // и только потом проверяем текущий
end;
end;

- то постоянного нуля в ответе уже не будет...

P.S. Я бы заменил sov(a[n]) = false на not sov(a[n])...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата(volvo @ 25.12.2010 19:45) *

P.S. Я бы заменил sov(a[n]) = false на not sov(a[n])...


И

if s=x then sov:=true
else sov:=false;


На sov := s=x;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


Благодарствую, всё работает) good.gif
надеюсь, я когда-нибудь пойму рекурсию smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
надеюсь, я когда-нибудь пойму рекурсию
"Чтобы понять рекурсию, нужно понять рекурсию..." (С)
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 26.04.2024 7:46
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name