Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2014, 11:17   #1
LetsRock
 
Регистрация: 18.08.2014
Сообщений: 8
По умолчанию Помогите разобраться с рекурсивной процедурой

В общем, читаю книгу С.М. Окулова "Основы программирования", сейчас нахожусь в теме "Рекурсия".
Есть раздел экспериментальной работы, там такое условие задачки:
Даны натуральные числа n и k. Перечислить все последовательности длины n из чисел от 1 до k. Например, n=3, k=2. Количество последовательностей — k^n(8). То есть 111, 112, 121, 122, ..., 222.
И внизу дается ее решение, вот код:
Код:
Const 
n=3;
к=2 ;
Type MyArray=Array[1. .n] Of 0 . .к;
Var A:MyArray;

Procedure Print;
Var l: Integer;
Begin
  For l: =1 To n Do Write (A [i ] : 3) ;
  WriteLn ;
End;

Procedure Solve (t:Integer);
Var l: Integer;
Begin
  If t>n Then Print
    Else For i:=l To k Do 
      Begin
        A[t] :=i;
        Solve (t+1) ;
      End;
End;

Begin
FillCnar (A, SizeOf (A) ,0) ;
Solve (1) ;
End.
Для меня эта процедура как черный ящик. При пошаговой отладке все равно ничего не понятно. Я знаю, что там действует стек вызовов, но от этого легче не становится. Поэтому прошу тех, кому несложно, можете пошагово описать, что творится внутри этого когда? Весь мозг сломал себе уже.
P/S.Первые три шага понятны, а дальше уже...

Последний раз редактировалось LetsRock; 18.08.2014 в 11:20.
LetsRock вне форума Ответить с цитированием
Старый 18.08.2014, 11:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
For i:=l To k Do
Не могу понять что это за цикл...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2014, 11:52   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

перебор комбинаций на заданном и нижележащих уровнях.
если мы достигли конца (по глубине/длине) последовательности то вывести ее, иначе последовательно перебрать значения на заданном уровне и при каждом значении текущего уровня осуществить перебор следующего уровня по глубине/длине.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.08.2014, 12:20   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не могу понять что это за цикл...
Дык 1-ка.. Не?
Poma][a вне форума Ответить с цитированием
Старый 18.08.2014, 15:49   #5
LetsRock
 
Регистрация: 18.08.2014
Сообщений: 8
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
перебор комбинаций на заданном и нижележащих уровнях.
если мы достигли конца (по глубине/длине) последовательности то вывести ее, иначе последовательно перебрать значения на заданном уровне и при каждом значении текущего уровня осуществить перебор следующего уровня по глубине/длине.
а можно пошаговое объяснение? Я, кажется, первые две комбинации понимаю. Мне больше не понятно как потом на первой позиции двойка ставится. Буду благодарен
LetsRock вне форума Ответить с цитированием
Старый 18.08.2014, 16:32   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
а можно пошаговое объяснение?
берете мой текст и раскладываете его на строки кода.
Цитата:
Мне больше не понятно как потом на первой позиции двойка ставится.
Цитата:
Код:
    Else For i:=l To k Do 
      Begin
        A[t] :=i;
при t=1 и i=2
Цитата:
последовательно перебрать значения на заданном уровне
t-уровень i=значение
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.08.2014 в 16:34.
evg_m вне форума Ответить с цитированием
Старый 18.08.2014, 16:36   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ты говоришь, напишу-ка я некую процедуру P(k, n, s)
Где k - наибольшее значение одно элемента массива, который мы будем составлять
N - кол-во элементов, которые мы будем составлять
s - текущий индекс элемента (индекс элемента куда мы будем вставлять следующее число)

И тогда..
На s-тую позицию ты должон вставить все числа от 1 до k и вызвать туже самую процедурку.. отличаться вызов будет лишь на два символа..
Код:
for i := 1 to k do  begin
     a[s] := i;
     P(k, n, s+1)
end;
Теперь описываем дно рекурсии и радуемся..
Poma][a вне форума Ответить с цитированием
Старый 22.08.2014, 14:32   #8
WhatO_o?!
Пользователь
 
Регистрация: 11.06.2011
Сообщений: 54
По умолчанию

Оффтоп
Цитата:
Procedure Solve (t:Integer);
Var l: Integer;
Begin
If t>n Then Print
Else For i:=l To k Do
Begin
A[t] :=i;
Solve (t+1) ;
End;
End;
Я дико извиняюсь, но

Var l: Integer;
...
Else
For i:=l(L) To k Do

Как оно вообще может работать, если значение переменной будет равно чему угодно, ибо оно не присваивалось?

Я обратился к гуглу, он послал меня сюда , где написано
Цитата:
Если арифметической переменной не присвоить какое-либо значение, то по умолчанию она будет равна нулю.
Проэксперементировав у себя, я вообще получил значение "от балды" 4353100
Здесь могла бы быть ваша реклама
WhatO_o?! вне форума Ответить с цитированием
Старый 22.08.2014, 15:10   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если арифметической переменной не присвоить какое-либо значение, то по умолчанию она будет равна нулю.
Это только к глобальным переменным относится.
А я выше задавал этот вопрос автору. Может там всетки единица, как Рома говорит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться с процедурой. Winterfox Помощь студентам 0 20.12.2011 23:53
проблемы с рекурсивной процедурой Xsires Паскаль, Turbo Pascal, PascalABC.NET 0 03.06.2010 00:40
решить с использованием рекурсивной подпрограммы. помогите пожалуйста ваще ни че не понял st1m Паскаль, Turbo Pascal, PascalABC.NET 2 02.04.2009 15:31
Помогите с процедурой... Arkuz Помощь студентам 10 15.05.2008 08:56
Помогите разобраться с процедурой OnKeyDown!!! frai Общие вопросы Delphi 9 13.04.2007 15:46