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


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

Группа: Пользователи
Сообщений: 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

 





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