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

> Метод индуктивной функции..часть 2
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Женский
Реальное имя: Olya

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


blink.gif У меня тоже проблемы с этим методом, только задание другое:

Дана последовательность вещественных чисел, заданная в типизированном файле. Методом индуктивной функции вычислить среднюю длину связных подпоследовательностей отрицательных чисел.

Что здесь можно сделать? wacko.gif smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


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

Поясню только основной момент, про индуктивную функцию. Индуктивной, грубо говоря, называется функция, которую можно посчитать через предыдущий результат. В нашем случае, перед считыванием очередного числа мы как бы уже имеем длину текущей цепочки. Считываемое число либо оборвет ее, либо увеличит на единицу. То есть предыдущий результат лтбо фиксируется, либо увеличивается и смотрится, что там дальше. Иначе говоря, на каждом этапе мы должны воспользоваться результатом предыдущего этапа. А это значит, что можно использовать то, что в программировании называется рекурсия: вызов функции из тела самой этой функции. Именно это и характеризует индуктивность функции (одного названия, увы, недостаточно smile.gif).

Посмотри внимательно на тело функции, особенно присвоение:
NegChainL:=NegChainL+1
В левой части стоит значение, которое возвратит функция по окончании своей работы, а в правой то же самое слово представляет собой последующий вызов этой же функции. Это и есть рекурсия (в переводе на русский - повторный вход). При этом в стеке создается еще одна копия всех данных этой функции, так что, например, переменная a в ней уже не равна переменной a в вызвавшей функции. Программный код же используется тот же самый. Вложенных вызовов может быть очень много - сколько позволит размер стека. Если стек переполнится, программа свалится, но в нашем случае такое вряд ли случится - несколько десятков вложений вполне нормально.

Данные читай из файла negchain.dat - по одному чилу на строке.

Я не написал никаких комментариев - добавь их, пожалуйста, сама. И покажи тут, что у тебя получилось.
Успехов! smile.gif
{Average negative chain length calculating}
{by Lapp}
var
f:text;
n,l,m:integer;

function NegChainL:integer;
var
a:real;
begin
ReadLn(f,a);
if EoF(f) or(a>0) then NegChainL:=0 else NegChainL:=NegChainL+1
end;

begin
Assign(f,'NegChain.dat');
Reset(f);
n:=0;
m:=0;
repeat
l:=NegChainL;
if l>0 then begin
Inc(n);
m:=m+l
end
until EoF(f);
Close(f);
if n=0 then WriteLn('No negative chains found')
else WriteLn('The average negative chain length is ',m/n:8:3);
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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