Форум программистов, компьютерный форум, киберфорум
Наши страницы
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
PozzziTRON
0 / 0 / 0
Регистрация: 15.11.2017
Сообщений: 3
1

Проблема с рекурсией

07.09.2019, 16:26. Просмотров 902. Ответов 4
Метки нет (Все метки)

Всем доброго дня.
При решении задачи, столкнулся с проблемой. Необходимо посчитать кол-во найденных комбинаций.
Всё перепробовал, так и не выходит. Помогите)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
program num_3;
 
var
  n: integer;
 
procedure rec(n, s, j: integer);
  
  var
    i, a: integer;
    
  begin
    
    for i := j to n // Перебор всех комбинаций
      do
        if s + i = n // Если найдена комбинация
          then
            begin
              // Вот тут счёт
            end
          else
            if s + i < n
              then
                rec(n, s+i, i);
  end;
 
begin
  write('Введите число: ');
  readln(n);
  
  rec(n, 0, 1);
end.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2019, 16:26
Ответы с готовыми решениями:

Програма с рекурсией
Помогите,мне надо описать рекурсивную функцию,которая для заданого ε&gt;0 обсчитывала б границу...

нужно решить рекурсией
Найдите сумму цифр заданного натурального числа. var n,s:integer; begin s:=0; ...

Рисование кругов рекурсией

нужно решить рекурсией
Треугольник задан координатами своих вершин. Составить программу вычисления его площади.

Сумма элементов с рекурсией
всем здравствуйте! в общем проблема такая: дана задача : написать рекурсивную программу...

4
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
07.09.2019, 17:51 2
Лучший ответ Сообщение было отмечено PozzziTRON как решение

Решение

Не создавайте дубли
Проблема с рекурсией

Добавлено через 37 минут
Если сохранять алгоритм (и убрать полный бред вроде сохранения n в глобальную переменную):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
function rec(n, s, j: integer): integer;
begin
  for var i := j to n do
    if s + i = n then
      Result += 1 else
    if s + i < n then
      Result += rec(n, s + i, i);
end;
 
begin
  var n := ReadlnInteger('Введите число: ');
  rec(n, 0, 1).Println;
end.
Однако это тот ещё говнокод...

1. s + i = n не обязательно проверять на каждой итерации. Если вы учились во втором классе школы - вы знаете что если s + i = n, то i = n-s. И в for - зачем у вас to n, если числа > n-s всё равно не дадут ни 1 комбинацию.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function rec(n, s, j: integer): integer;
begin
  if n-s >= j then Result += 1;
  
  for var i := j to n-s do
    if s + i < n then
      Result += rec(n, s + i, i);
  
end;
 
begin
  var n := ReadlnInteger('Введите число: ');
  rec(n, 0, 1).Println;
end.
(стоит добавить что я вообще хз правильный ли результат даёт этот алгоритм, хотя бы из за того - как вы офигенно объяснили задание)
((P.S. при написании 2. я ещё проверил - некоторые комбинации по 2 раза считает, так что явно алгоритм неправильный))

2. Рекурсия в данном случае ни на сколько не оправданна. И дело даже не в производительности и том что эта программа крашнется на больших числах. В вашем алгоритме нет ничего, для чего нужен был бы стек. А значит и код с рекурсией будет обязательно сложнее.

Если без неё - можно включить голову и понять что комбинаций будет всегда N (или N+1, если разрешить 0 в комбинациях).
1
PozzziTRON
0 / 0 / 0
Регистрация: 15.11.2017
Сообщений: 3
07.09.2019, 20:51  [ТС] 3
Я понимаю что без рекурсии всё работает гораздо лучше, но в задаче требуется именно через неё.
0
Sun Serega
674 / 452 / 225
Регистрация: 07.04.2017
Сообщений: 1,951
08.09.2019, 06:04 4
В задаче, текст которой вы всё ещё не озвучили. Чего вы вообще ждёте?
0
Puporev
Модератор
57523 / 43860 / 30299
Регистрация: 18.05.2008
Сообщений: 104,735
08.09.2019, 06:06 5
но в задаче требуется именно через неё.
А задача-то какая?
0
08.09.2019, 06:06
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2019, 06:06

Решение уравнения с рекурсией
Программа должна содержать процедуру (или функцию) для рекурсивной реализации метода бисекции и...

Найти максимальное число рекурсией
Из числа N=151569 найти максимальное число рекурсией. Заранее благодарю,тех кто откликнется! ...

Как работает программа с рекурсией?
Где можно почитать как работает программа с рекурсией в pascal ? , желательно с объяснение каждой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.