ПАСКАЛЬ. Дано естественное число N. Нужно получить и вывести на экран
ПАСКАЛЬ. Дано естественное число N. Нужно получить и вывести на экран все возможные разные методы представления этого числа в виде суммы естественных чисел (то есть, 1 + 2 и 2 + 1 это один и тот же метод разложения числа 3). Решите задачку с подмогою рекурсивной процедуры.
Задать свой вопрос
Evgenija
И вновь рекурсия. Ваш учитель решил устроить поход против обычных функций и процедур?
Александр
Он это любит XD
Сашок
Да это не то, чтоб просто либо сложно... это Неразумно. Должно быть ограничение на n, чтоб не превращать задачу в фактически неразрешимую.
Вадим Ганушевич
стек рекурсий умирает очень прытко - пробуйте это разъяснить Вашему учителю, если он не в курсе.
Николай Нерушенко
Все берется с сайта Полякова... Это он туда такое "волшебство" выкладывает
Valerij Apurin
А если он почитает рекурсии, пусть вычислит значение функции Аккермана A(20,20)
Даниил Ящуков
там на самом деле всего 3 задания по рекурсиям. 1 я как то сделал, а вот 2 и 3 теснее не могу... =)
Илюха Жустров
Могу Для вас только пособолезновать. рекурсия - удивительный инструмент, но использовать её надобно очень продуманно.
Егор Легкодух
Ну, и на этом спасибо... =(
Алексей Сарахман
Есть методы, которые по собственной природе рекурсивны. И есть методы итерационные, в которые рекурсию "за уши" тащат. Последнее - плохо.
1 ответ
Виталий Вязаветский
Const PTR = 10;
type razbivka = array[0..PTR] of byte;
var n, i, z, k: byte;
x: razbivka;
procedure p(var x: razbivka; var z: byte);
var i, j, s: byte;
begin
i := z - 1;
s := x[z];
while (i gt; 1) and ( x[i - 1] lt;= x[i] ) do
begin
s := s + x[i];
dec(i);
end;
inc( x[i] );
z := i + s - 1;
for j := i + 1 to z do
x[j] := 1;
end;
begin
write('Введите число: ');
readln(n);
write(n,' = ');
z := n;
for i := 1 to z do
x[i] := 1;
for i := 1 to n do begin
if i gt; 1 then write(' + ');
write( x[i], '' );
end;
writeln;
repeat
p( x, z );
inc(k);
write( n,' = ' );
for i := 1 to z do begin
if i gt; 1 then write(' + ');
write( x[i], '' );
end;
writeln;
until z = 1;
end.
p.s: отыскал в интернете для вас вариант с рекурсией. Сами сможете убедиться, что с ней только хуже (по быстродействию уж точно)
const m = 100;
var a: array[1..m] of integer;
k, n: integer;
procedure p(j,n: integer);
var i: integer;
begin if ( n = 0 ) and ( k gt; 1 ) then
begin for i := 1 to k do
write( a[i] : 4 );
writeln;
end else for i := j to n do
begin
Inc(k);
a[k] := i;
p( j, n - i );
Dec(k);
end;
end;
begin
write('Введите число: ');
readln(n);
k := 0;
p(1,n);
end.
значения PTR и m можно поставить и больше, но тогда я не поручаюсь)
type razbivka = array[0..PTR] of byte;
var n, i, z, k: byte;
x: razbivka;
procedure p(var x: razbivka; var z: byte);
var i, j, s: byte;
begin
i := z - 1;
s := x[z];
while (i gt; 1) and ( x[i - 1] lt;= x[i] ) do
begin
s := s + x[i];
dec(i);
end;
inc( x[i] );
z := i + s - 1;
for j := i + 1 to z do
x[j] := 1;
end;
begin
write('Введите число: ');
readln(n);
write(n,' = ');
z := n;
for i := 1 to z do
x[i] := 1;
for i := 1 to n do begin
if i gt; 1 then write(' + ');
write( x[i], '' );
end;
writeln;
repeat
p( x, z );
inc(k);
write( n,' = ' );
for i := 1 to z do begin
if i gt; 1 then write(' + ');
write( x[i], '' );
end;
writeln;
until z = 1;
end.
p.s: отыскал в интернете для вас вариант с рекурсией. Сами сможете убедиться, что с ней только хуже (по быстродействию уж точно)
const m = 100;
var a: array[1..m] of integer;
k, n: integer;
procedure p(j,n: integer);
var i: integer;
begin if ( n = 0 ) and ( k gt; 1 ) then
begin for i := 1 to k do
write( a[i] : 4 );
writeln;
end else for i := j to n do
begin
Inc(k);
a[k] := i;
p( j, n - i );
Dec(k);
end;
end;
begin
write('Введите число: ');
readln(n);
k := 0;
p(1,n);
end.
значения PTR и m можно поставить и больше, но тогда я не поручаюсь)
Семён Логов
Вау, если ввести в программке с рекурсией число 100 выходит очень красиво ^_^
, оставишь ответ?
Похожие вопросы
-
Вопросы ответы
Новое
NEW
Статьи
Информатика
Статьи
Последние вопросы
Рассматривая литературный язык как сложное взаимодействие книжного языка и разговорного,В.И.Чернышёв горячо
Разные вопросы.
Арабы входят в __________________ групп народов. Местом расселения арабов с незапамятных
Разные вопросы.
Грузовой автомобиль марки краз за одну поездку может доставить 7.500 кирпичей
Математика.
Определить предложения какие они по цели высказывания и по интонации
Русский язык.
"Три толстяка" Называли эту площадь Площадью Звезды последующей причине.
Русский язык.
на одной грядке коротышки посадили 3 ряда морковок по 8 штук
Разные вопросы.
эссе на тему какое образование дается в каждой семье
Қазақ тiлi.
Put the verb in brackets into the Present Indefinite.
1The Volga ,
Английский язык.
Сколько стоит коктейль молочный? Точную цену надо?
Математика.
Составить рассказ Из чего складывался культ монарха помазанника Божьего?
История.
Облако тегов