ПАСКАЛЬ. Дано натуральное число N. Требуется получить и вывести ** экран все возможные...

0 голосов

ПАСКАЛЬ. Дано натуральное число N. Требуется получить и вывести на экран все возможные различные способы представления этого числа в виде суммы натуральных чисел (то есть, 1 + 2 и 2 + 1 – это один и тот же способ разложения числа 3). Решите задачу с помощью рекурсивной процедуры.


спросил от (76 баллов) в категории Информатика
оставил комментарий от Одаренный (2.3k баллов)

И опять рекурсия. Ваш преподаватель решил устроить поход против обычных функций и процедур?

оставил комментарий от (76 баллов)

Он это любит XD

оставил комментарий от Архангел (142k баллов)

Да это не то, чтобы просто или сложно... это ГЛУПО. Должно быть ограничение на n, чтобы не превращать задачу в практически неразрешимую.

оставил комментарий от Архангел (142k баллов)

стек рекурсий помирает очень быстро - попробуйте это объяснить Вашему преподавателю, если он не в курсе.

оставил комментарий от (76 баллов)

Все берется с сайта Полякова... Это он туда такое "чудо" выкладывает

оставил комментарий от Архангел (142k баллов)

А если он обожает рекурсии, пусть вычислит значение функции Аккермана A(20,20)

оставил комментарий от (76 баллов)

там на самом деле всего 3 задания по рекурсиям. №1 я как то сделал, а вот №2 и №3 уже не могу... =)

оставил комментарий от Архангел (142k баллов)

Могу Вам только посочувствовать. рекурсия - чудесный инструмент, но применять её надо крайне обдуманно.

оставил комментарий от (76 баллов)

Ну, и на этом спасибо... =(

оставил комментарий от Архангел (142k баллов)

Есть алгоритмы, которые по своей природе рекурсивны. И есть алгоритмы итерационные, в которые рекурсию "за уши" тянут. Последнее - плохо.

1 Ответ
0 голосов
ответил от Одаренный (2.3k баллов)
 
Лучший ответ

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 > 1) and ( x[i - 1] <= x[i] ) do<br>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 > 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 > 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 > 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 можно поставить и больше, но тогда я не ручаюсь)

оставил комментарий от (76 баллов)

Вау, если ввести в программе с рекурсией число 100 получается очень красиво ^_^

...