Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Вниз

Рекурсия   Найти похожие ветки 

 
Svin   (2002-09-23 14:56) [0]

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


 
Внук   (2002-09-23 15:19) [1]

1. Открыть файл и встать на первую позицию в нем.
2. Найти первое от текущей позиции отрицательное число, занести в локальную переменную.
3. Если найдено - перейти к пункту 2 (рекурсия) и затем напечатать найденное число
4. Если не найдено - выход (условие выхода из рекурсии)


 
MBo   (2002-09-23 15:23) [2]

Рекурсия здесь за уши притянута
примерно так

procedure BackNeg;
begin
if not eof then begin
прочитать строку
извлечь число
BackNeg;
если отрицательное, вывести
end;
end;


 
Cu   (2002-09-23 15:42) [3]

Блин.. Не соображается .. понедельник :(
Короче сортировку тебе надо наверно рекурсивной сделать
(что-то мне подсказывает)


 
gek   (2002-09-23 15:47) [4]

Да зачем сортировку делать?
Борис правильно написал, этого вполне достаточно, ведь сказано было сделать с рекурсией - сделал. А сортировку в ListBox можно сделать, что бы не сильно извращаться


 
Внук   (2002-09-23 15:47) [5]

Рекурсией "естественным образом" здесь достигается обратный порядок при печати :))


 
Svin   (2002-09-23 18:31) [6]

Народ спасибо ОГРОМНОЕ ВСЁ работает
но вот появился вопросик
вот исодный текст
procedure Tform1.getNum;
var
s:string;
Begin
if not eof(FILEDATA) then
Begin
ReadLn(FileDATA,s);
GetNum;
if StrToInt(s)<0 then listbox1.Items.Add(s);
End;
End;
Немогли бы вы обьяснить поподробней почему всё выводится именно
в обратном порядкеи как всё действует а то я несильно вьехал


 
keymaster   (2002-09-23 18:34) [7]

хм.... а чего тут непонятного?
оно по другому и не должно работать...

для понимания, возьми лист бумаги, карандаш
и по старинке блок-схемку нарисуй :)


 
Svin   (2002-09-23 18:36) [8]

здесь переменная s читается один раз и поэтому неочень понятно
почему всё происходит с конца здесь что когда процедура вызывается при каждом разе создаётся копия s или как


 
MBo   (2002-09-23 18:41) [9]

да, при каждом рекурсивном вызове в стеке создается своя копия.
Кстати, можно и так

Begin
if eof(FILEDATA) then Exit
ReadLn(FileDATA,s);
GetNum;
if StrToInt(s)<0 then listbox1.Items.Add(s);
End;


 
Svin   (2002-09-24 08:19) [10]

Спасибо MBo но почему if StrToInt(s)<0 then listbox1.Items.Add(s); Начинает с последней копии
И откуда оно знает что всё начинается с последнего там же копии некак ненумеруются


 
MBo   (2002-09-24 08:41) [11]

Тебе знакомо понятие стека (последним вошел, первым вышел)?
Аналогией может служит стопка тарелок.
При кажлом вызове процедуры в стек записываются (создаются) ее локальные переменные (и еще кое-что, в данном случае неважно).
Подпрограмма работает с ними через указатель на вершину стека (SP,BP) и смещение относительно него.
Утрированный пример (не различая sp и bp)
В процедуре используются 2 Integer переменные.
Первая находится по адресу BP-4, вторая по адресу BP.
Если вызвать из нее себя же, в стеке появятся два новых числа, в новой реинкарнации процедуры адрес BP сместится, но для нее опять же первая будет по адресу BP-4, вторая по адресу BP (заметь, что BP в ней отличается от первого). Когда процедура завершается, со стека снимаются ее лок. переменные, указатель BP смещается в то положение, в каком он был до ее вызова. Мы возвратились в первую копию процедуры, ее локальные переменные снова доступны, при выходе из нее они снимаются, указатель стека сдвигается.

В твоей задаче в конце цепочки рекурсивных процедур стек выглядит так
S(1)
S(2)
S(3)
...
S(n)

где S(i) - строка для i-1 итерации процедуры.
При возврате из последнего вызова СНАЧАЛА выводится S(N) (последняя локальная перменная в стеке) и Т.Д.




 
Svin   (2002-09-24 09:54) [12]

Круто !!
Теперь всё понятно спасибо



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-8052
Metotrone
2002-09-22 18:59
2002.10.03
Работа со Strings


3-7801
karaf
2002-09-11 19:11
2002.10.03
TADOCommand.Cancel ?


3-7813
REA
2002-09-09 12:53
2002.10.03
А как отличить Append от Insert?


3-7857
iif
2002-09-13 11:16
2002.10.03
Lookup-поле с LookupDataset из другой БД


3-7826
cutter-pro
2002-09-12 13:06
2002.10.03
Пробелы в SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский