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

0 голосов
242 просмотров

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


Информатика (76 баллов) | 242 просмотров
0

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

0

Он это любит XD

0

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

0

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

0

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

0

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

0

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

0

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

0

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

0

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

Дан 1 ответ
0 голосов
Правильный ответ

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 можно поставить и больше, но тогда я не ручаюсь)

(2.3k баллов)
0

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