Плиииизззз... с помощью рекурсии Дано натуральное число N. Требуется получить и вывести...

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

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


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

сложная

0

если понимаешь рекурсию, то нет

0

а вообще эта задача на олимпиаде встречалась

0

сейчас увидишь, как все просто)

0

рекурсия сама по себе штука не простая

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

//PascalABC.NET 3.1 сборка 1200
procedure Decomposition(depth, previous, rest: integer; a: string);
begin
  if rest < 0 then
    exit;
 
  if (rest = 0) and a.Contains('+') then begin
    Println(a);
    exit;
  end;
 
  for var i := previous to rest do
    Decomposition(depth + 1, i, rest - i,
      (a = '') ? i.ToString() : a + ' + ' + i.ToString());
end;

begin
  Decomposition(1, 1, ReadInteger('n ='), '');
end.

(53.1k баллов)
0

спасибо, попробую

0

на то она и школа чтоб учили и помогали

0

тогда прям на уроке говоришь что нужна была одна функция, ее не учили, полез в гуголь искать и нашел, может она не правильная, подскажите как надо

0

в школе

0

и где это не прокатит?

0

ну

0

какую команду вы знаете чтоб преобразовывала число в строку?

0

поэтому она не прокатит

0

какую команду вы знаете чтоб преобразовывала число в строку?

0

нечта

0 голосов

Var
  n: integer;
  a: array[1..100] of integer;
procedure gen(pos, prev, sum: integer);
var i: integer;
begin
  if sum > 0 then
  for i := prev to sum do
  begin
    a[pos] := i;
    gen(pos + 1, i, sum - i);
  end
  else if a[1] < n then
  begin
    write(a[1]);
    for i := 2 to pos - 1 do write(' + ', a[i]);
    writeln;
  end;
end;
begin
  read(n);
  gen(1, 1, n);
end.

(13.3k баллов)
0

Можно и без массива, но это намного сложнее, да и вообще будет работать дольше

0

мне вот и надо без массива, это обязательное условие

0

program ex1;
var n,t: integer;
procedure A(p, v, s: integer);
var i: integer;
begin
if s > 0 then
for i := v to s do
begin
t := i;
A(p + 1, i, s - t);
end
else if t < n then
begin
write(t);
for i := 2 to p - 1 do
write(' + ', t);
writeln;
end;
end;
begin
read(n);
A(1, 1, n);
end.

0

что изменить, чтобы считала правильно

0

Надо, чтобы без массива была

0

я не говорю, что это плохо)

0

много условий это фильтры и удобочитаемость, так что не надо говорить что это плохо

0

procedure gen(depth, previous, number: integer; a: string);
begin
if number < 0 then
exit;

if (number = 0) and a.Contains('+') then begin
Println(a);
exit;
end;

for var i := previous to number do
gen(depth + 1, i, number - i,
(a = '') ? i.ToString() : a + ' + ' + i.ToString());
end;

begin
var n := ReadInteger;
gen(1, 1, n, '');
end.

0

или даже так var a := true ? 1 : 0;

0

тернарник есть: writeln(true ? 1 : 0)