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

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

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

 
 Ответить  Открыть новую тему 
> Программа с рекурсией, Описать алгоритм
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Влад

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


Нужно описать по какому принципу работает программа(разложить натуральное число в виде суммы натуральных чисел)
 Program lab_4;
var n: integer;
c: array [ 1..100 ] of integer;
a: boolean;
procedure sum(y,k,x:integer);
const plus:array[boolean] of char=('+',' ');
var i: integer;

begin
if y=0 then begin a:=true;
if a then begin for i:=1 to x-1 do write (c[i], plus[i=x-1]);
writeln end;
end else begin for i:= 1 to k do
if y-i>=0 then begin c[x]:=i;
sum(y-i,i,x+1 );

end; end; end;

begin writeln('vvedite 4islo N');
readln(n);
sum(n,n, 1 );
readln
end.


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


Гость






Цитата
Нужно описать по какому принципу работает программа
Ну, так описывай. Ты ж сумел поменять все имена переменных с нормальных (типа num, len, print) на ничего не значащие (x, y, a), и переформатировать программу так, что она вообще уже ни на что не похожа? Вот теперь сам и разбирайся, что это за рекурсия, и как она работает...

Особенно порадовал меня фрагмент
Цитата
a:=true;
if a then begin ...
Очень правильное решение, ага...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Влад

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


Программу писал не я и понятия не имею о значении num, len, print, мне нужно только разобраться каков алгоритм чтобы можно было объяснить математически
думаю что переменная i отнимается от n, затем от разницы между n и i опять отнимается i до тех пор пока разница >=0, и значения i заносятся в матрицу. В первом цикле i=1 и результат состоит из единиц. Мне не понятно как присваиваются значения i в следующих циклах
Если не сложно, направьте на путь истинный smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ночной волк
**

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

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


Program lab_4;
var n: integer;
c: array [ 1..100 ] of integer;


procedure sum(y,k,tek_pos:integer);
const plus:array[boolean] of char=('+',' ');
var i: integer;

begin
if y=0 then {число закончилось, приступаем к выводу}
begin
for i:=1 to tek_pos-1 do
write (c[i], plus[i=tek_pos-1]);{Здесь вывод чисел из массива, разделенных плюсами, в конце ставим пробел}
writeln
end

else
begin
for i:= 1 to k do
if y-i>=0 then {не пора ли остановиться?}
begin
c[tek_pos]:=i; {В текущую позицию заносим i}
sum(y-i,i,tek_pos+1 ); {рекурсия}
end;
end;
end;

begin

writeln('vvedite 4islo N');
readln(n);
sum(n,n, 1 );
readln

end.


1.Это нормальный вид

2. предположим у нас число 4
Первым шагом будет строка из единиц 1 1 1 1 - программа входит сама в себя вглубь 4 раза
Затем одно из чисел 2 (последняя подпрограмма вылетает, срабатывает условие, программа выходит на один уровень выше, благодаря циклу for третье число - 2) 1 1 2
1 1 3 - нельзя, поэтому 1 2 и у нас остается еще 1 входим на 3 уровень т.е.
1 2 1
И так далее, программа перебирает все возможные варианты разложения.
Советую запустить отладчик и пронаблюдать процесс самостоятельно


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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