Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа с рекурсией
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Lostsage
Нужно описать по какому принципу работает программа(разложить натуральное число в виде суммы натуральных чисел)
 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.


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

Особенно порадовал меня фрагмент
Цитата
a:=true;
if a then begin ...
Очень правильное решение, ага...
Lostsage
Программу писал не я и понятия не имею о значении num, len, print, мне нужно только разобраться каков алгоритм чтобы можно было объяснить математически
думаю что переменная i отнимается от n, затем от разницы между n и i опять отнимается i до тех пор пока разница >=0, и значения i заносятся в матрицу. В первом цикле i=1 и результат состоит из единиц. Мне не понятно как присваиваются значения i в следующих циклах
Если не сложно, направьте на путь истинный smile.gif
ammaximus
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
И так далее, программа перебирает все возможные варианты разложения.
Советую запустить отладчик и пронаблюдать процесс самостоятельно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.