Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2017, 16:26   #1
Stasvan
Новичок
Джуниор
 
Регистрация: 13.03.2017
Сообщений: 1
Лампочка Преобразование рекурсии в итерацию (Delphi/Pascal)

Задание:
"Решить задачу двумя способами – с применением рекурсии и без нее.
Создайте процедуру, печатающую все возможные представления натурального числа N в виде суммы других натуральных чисел."


Вот решение через рекурсию:
Код:
type arr=array[1..400]of integer;
 
procedure Recursion(i,pos,sum,n:integer;a:arr);
var j,k:integer;
 
begin
  for j:=i to n-1 do
  begin
    a[pos]:=j;
    if sum+j=n then
    begin
      for k:=1 to pos do
        if k>1 then
          write('+',a[k])
        else
          write(a[k]);
        writeln
    end
    else
      if sum+j<n then
        Recursion(j,pos+1,sum+j,n,a);
  end;
end;
 
var n:integer;
    a:arr;
begin
  write('n:');
  readln(n);
  writeln('recursion:');
  Recursion(1,1,0,n,a);
  readln;
end.
Нужна помощь с созданием итерации.
Stasvan вне форума Ответить с цитированием
Старый 05.06.2017, 10:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так не проще?

Код:
procedure writesum(rs: string; sum, first: integer; n: integer);
var
  j: integer;
  s1 :string;
begin
   if sum<n then 
     for j:=first to n-1 do begin
        str(j,s1);
        if rs<>'' then s1:='+'+s1;
        writesum(rs+s1, sum+j, j, n)
     end;
    if sum=n then
       writeln(rs);
 end;

 
var n:integer;
begin
  write('n:');
  readln(n);
  writeln('recursion:');
  writesum('',0,1,n);
  readln;
end.
код взят тут и чуть переделан.

Последний раз редактировалось Serge_Bliznykov; 05.06.2017 в 10:16.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.06.2017, 13:43   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

итерационный вариант взят отсюда

Код:
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
  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.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из рекурсии в итерацию Вероника99 Помощь студентам 11 06.10.2016 10:14
Решил на Mathcad.Написать итерацию на Pascal. piko Помощь студентам 0 12.02.2013 14:25
Работа с массивом/строкой символов, преобразование символа с число. (Pascal, Delphi) Савва Помощь студентам 8 29.01.2012 12:27
Перевод из рекурсии на итерацию Anubys Помощь студентам 0 18.04.2011 18:12
Рекурсии в pascal Nogard Помощь студентам 1 22.06.2009 12:08