1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Нужно описать по какому принципу работает программа(разложить натуральное число в виде суммы натуральных чисел)
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.
Нужно описать по какому принципу работает программа
Ну, так описывай. Ты ж сумел поменять все имена переменных с нормальных (типа num, len, print) на ничего не значащие (x, y, a), и переформатировать программу так, что она вообще уже ни на что не похожа? Вот теперь сам и разбирайся, что это за рекурсия, и как она работает...
Программу писал не я и понятия не имею о значении num, len, print, мне нужно только разобраться каков алгоритм чтобы можно было объяснить математически думаю что переменная i отнимается от n, затем от разницы между n и i опять отнимается i до тех пор пока разница >=0, и значения i заносятся в матрицу. В первом цикле i=1 и результат состоит из единиц. Мне не понятно как присваиваются значения i в следующих циклах Если не сложно, направьте на путь истинный
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 И так далее, программа перебирает все возможные варианты разложения. Советую запустить отладчик и пронаблюдать процесс самостоятельно