Нужно описать по какому принципу работает программа(разложить натуральное число в виде суммы натуральных чисел)
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;
beginif y=0thenbegin a:=true;
if a thenbeginfor i:=1to x-1do write (c[i], plus[i=x-1]);
writeln end;
endelsebeginfor i:= 1to k doif y-i>=0thenbegin 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
21.01.2009 16:37
Цитата
Нужно описать по какому принципу работает программа
Ну, так описывай. Ты ж сумел поменять все имена переменных с нормальных (типа num, len, print) на ничего не значащие (x, y, a), и переформатировать программу так, что она вообще уже ни на что не похожа? Вот теперь сам и разбирайся, что это за рекурсия, и как она работает...
Особенно порадовал меня фрагмент
Цитата
a:=true;
if a thenbegin ...
Очень правильное решение, ага...
Lostsage
21.01.2009 18:14
Программу писал не я и понятия не имею о значении num, len, print, мне нужно только разобраться каков алгоритм чтобы можно было объяснить математически думаю что переменная i отнимается от n, затем от разницы между n и i опять отнимается i до тех пор пока разница >=0, и значения i заносятся в матрицу. В первом цикле i=1 и результат состоит из единиц. Мне не понятно как присваиваются значения i в следующих циклах Если не сложно, направьте на путь истинный
ammaximus
22.01.2009 1:17
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;
beginif y=0then{число закончилось, приступаем к выводу}beginfor i:=1to tek_pos-1do
write (c[i], plus[i=tek_pos-1]);{Здесь вывод чисел из массива, разделенных плюсами, в конце ставим пробел}
writeln
endelsebeginfor i:= 1to k doif y-i>=0then{не пора ли остановиться?}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 И так далее, программа перебирает все возможные варианты разложения. Советую запустить отладчик и пронаблюдать процесс самостоятельно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.