ПАСКАЛЬ. Дано естественное число 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 можно поставить и больше, но тогда я не поручаюсь)
Семён Логов
Вау, если ввести в программке с рекурсией число 100 выходит очень красиво ^_^
, оставишь ответ?
Имя:*
E-Mail:


Последние вопросы
Рассматривая литературный язык как сложное взаимодействие книжного языка и разговорного,В.И.Чернышёв горячо

Разные вопросы.

Арабы входят в __________________ групп народов. Местом расселения арабов с незапамятных

Разные вопросы.

Грузовой автомобиль марки краз за одну поездку может доставить 7.500 кирпичей

Математика.

Определить предложения какие они по цели высказывания и по интонации

Русский язык.

"Три толстяка" Называли эту площадь Площадью Звезды последующей причине.

Русский язык.

на одной грядке коротышки посадили 3 ряда морковок по 8 штук

Разные вопросы.

эссе на тему какое образование дается в каждой семье

Қазақ тiлi.

Put the verb in brackets into the Present Indefinite. 1The Volga ,

Английский язык.

Сколько стоит коктейль молочный? Точную цену надо?

Математика.

Составить рассказ Из чего складывался культ монарха помазанника Божьего?

История.

Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт