Нужно описать по какому принципу работает программа(разложить натуральное число в виде суммы натуральных чисел)
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
21.01.2009 16:37
Цитата
Нужно описать по какому принципу работает программа
Ну, так описывай. Ты ж сумел поменять все имена переменных с нормальных (типа num, len, print) на ничего не значащие (x, y, a), и переформатировать программу так, что она вообще уже ни на что не похожа? Вот теперь сам и разбирайся, что это за рекурсия, и как она работает...
Особенно порадовал меня фрагмент
Цитата
a:=true; if a then begin ...
Очень правильное решение, ага...
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;
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;
2. предположим у нас число 4 Первым шагом будет строка из единиц 1 1 1 1 - программа входит сама в себя вглубь 4 раза Затем одно из чисел 2 (последняя подпрограмма вылетает, срабатывает условие, программа выходит на один уровень выше, благодаря циклу for третье число - 2) 1 1 2 1 1 3 - нельзя, поэтому 1 2 и у нас остается еще 1 входим на 3 уровень т.е. 1 2 1 И так далее, программа перебирает все возможные варианты разложения. Советую запустить отладчик и пронаблюдать процесс самостоятельно
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.